来个dalao帮改下。。无优化

P3366 【模板】最小生成树

dis再稍微开大一点没关系,但是你需要处理重边啊,很显然是去取权值最小的边加进去啊。我尝试看看帮您改改咯?
by Kalista @ 2018-07-31 21:06:33


@[执笔、捃尘](/space/show?uid=18535) 第一,您的初始化应该是n和n,而不是n和m。 第二,您在处理完边之后,需要先将dis[i]初始化为d[1][i]。 第三,您需要将当前最小值放到外层循环,因为如果您放在内层,是每个循环开一次,是记录不了当前最小值的。具体可以看看我改完的AC代码,改了缩进,您慢慢看吧。 ```cpp #include<bits/stdc++.h> using namespace std; const int maxN = 5050; const int maxM = 200001; const int maxint = 2147483647; int n,m,dis[maxN],d[maxN][maxN],mst = 0; bool vis[maxN] = {false}; void Prim (int); int main(){ cin>>n>>m; for (int i=1;i<=n;i++){ for (int j=1;j<=n;j++)d[i][j]=maxint; } for (int i=1;i<=m;i++){ int xi,yi,zi; cin >>xi>>yi>>zi; if(zi<d[xi][yi])d[xi][yi]=d[yi][xi]=zi; } for(int i=1;i<=n;i++)dis[i]=d[1][i]; Prim(1); cout<<mst; return 0; } void Prim (int v0){ int u; dis[v0]=0; //vis[1]=1; for(int i=1;i<=n;i++){ int minn=2147483647; for(int j=1;j<=n;j++){ if(dis[j]<minn&&!vis[j]){minn=dis[j];u=j;} } //printf("%d ",u); vis[u]=true; mst+=dis[u]; for(int j=1;j<=n;j++){ if(d[u][j]<dis[j]&&!vis[j])dis[j]=d[u][j]; } } //printf("\n"); } ```
by Kalista @ 2018-07-31 21:50:32


@[Kalista](/space/show?uid=47350) OrzOrzOrz为巨佬三番叩头,感谢您的指导
by 4kilometers @ 2018-08-01 08:34:44


@[执笔、捃尘](/space/show?uid=18535) emmm用不着的啦,小事情而已
by Kalista @ 2018-08-01 14:36:33


上一页 |