最小生成树-Prim算法

测试样例

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;
}
posted @ 2018-11-21 13:11  ChunhaoMo  阅读(140)  评论(0编辑  收藏  举报