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