第1行:2个数N,M中间用空格分隔,N为点的数量,M为边的数量。(2 <= N <= 1000, 1 <= M <= 50000)
第2 - M + 1行:每行3个数S E W,分别表示M条边的2个顶点及权值。(1 <= S, E <= N,1 <= W <= 10000)
输出最小生成树的所有边的权值之和。
9 14
1 2 4
2 3 8
3 4 7
4 5 9
5 6 10
6 7 2
7 8 1
8 9 7
2 8 11
3 9 2
7 9 6
3 6 4
4 6 14
1 8 8
37
用prim算法可以完成.
1 #include <iostream> 2 #include <cstring> 3 #include <cstdio> 4 #include <algorithm> 5 #define N 1005 6 #define inf 0x3f3f3f3f 7 #define mem(a) memset(a,0,sizeof(a)) 8 using namespace std; 9 int cost[N][N];//表示两点之间的距离,不存在则设为inf 10 int mincost[N];//从x集合出发到每个顶点的最小值 11 bool used[N];//判断是否在集合中的布尔数组 12 int n,m; 13 14 int prim(){ 15 for(int i=0;i<n;i++){//初始化mincost数组和used布尔数组 16 mincost[i]=inf; 17 used[i]=false; 18 } 19 mincost[0]=0;//赋给其初值 20 long long int ans=0; 21 22 while(true){ 23 int v=-1; 24 //从不属于x的顶点中选取从x到其权值最小的顶点 25 for(int u=0;u<n;u++) 26 if(!used[u]&&(v==-1||mincost[u]<mincost[v])) 27 v=u; 28 29 if(v==-1) 30 break;//条件成立则说明所有的点都已经加入 31 used[v]=true;//把顶点加入 32 ans+=mincost[v];//把边的长度加到结果里 33 34 for(int u=0;u<n;u++){ 35 if(!used[u]) 36 mincost[u]=min(mincost[u],cost[v][u]); 37 } 38 } 39 return ans; 40 } 41 int main(){ 42 cin>>n>>m; 43 int x,y,z; 44 memset(cost,inf,sizeof(cost)); 45 while(m--){ 46 scanf("%d%d%d",&x,&y,&z); 47 cost[--x][--y]=z; 48 cost[y][x]=z; 49 } 50 long long int k=prim(); 51 cout<<k<<endl; 52 return 0; 53 }
原文:http://www.cnblogs.com/zllwxm123/p/7506947.html