测试样例
7 9
1 2 28
1 6 10
2 3 16
2 7 14
3 4 12
4 5 22
4 7 18
5 6 25
5 7 24
3
代码
#include<bits/stdc++.h>
using namespace std;
const int maxn=1e2+10;
const int inf=9999999;
int n,m;
int edge[maxn][maxn],lowcost[maxn],nearvex[maxn];
//lowcost[i]表示该顶点到生成树集合各顶点最小的边的权值,
//若lowcost[i]=-1则已经在生成树集合,nearvex[i],表示i与生成树集合最近的那个点
void prim(int s){
int sumweight=0,sum=0;//sumweight统计总权值,sum统计边的数目
for(int i=1;i<=n;i++){
nearvex[i]=s;
lowcost[i]=edge[s][i];
}
nearvex[s]=-1;
for(int i=1;i<n;i++){
int Min=inf;
int v=-1;
for(int j=1;j<=n;j++){
if(nearvex[j]!=-1&&Min>lowcost[j]){
Min=lowcost[j];
v=j;
}
}
if(v!=-1){ sum++;
sumweight+=lowcost[v];
cout<<nearvex[v]<<' '<<v<<' '<<lowcost[v]<<endl;
nearvex[v]=-1;
for(int j=1;j<=n;j++){
if(nearvex[j]!=-1&&lowcost[j]>edge[v][j]){
lowcost[j]=edge[v][j];
nearvex[j]=v;
}
}
}
}
if(sum<n-1) cout<<"No MST\n";//边不到n-1,说明没有生成树
else cout<<"weight of MST is "<<sumweight<<endl;
}
int main(){
int u,v,c,s;
freopen("in.txt","r",stdin);
while(cin>>n>>m){
memset(edge,inf,sizeof(edge));
for(int i=1;i<=m;i++){
cin>>u>>v>>c; edge[u][v]=edge[v][u]=c;
}
for(int i=1;i<=n;i++) edge[i][i]=0;
cin>>s;
prim(s);
}
return 0;
}