题目参见:http://acm.hdu.edu.cn/showproblem.php?pid=1233
Prim实现
#include<iostream> using namespace std; const int Maxv=101; int map[Maxv][Maxv]; int vset[Maxv];//顶点访问记录 int lowcost[Maxv]; int main() { int sum; int n,i,j,cost; while(scanf("%d",&n) && n) { int m=n*(n-1)/2; while(m--) { scanf("%d %d %d",&i,&j,&cost); //printf("%d\n",i); map[i][j]=cost; } for(i=1;i<=n;i++) { vset[i]=0; lowcost[i]=map[1][i]; //初始化lowcost } vset[1]=1; int k ,min; sum=0; for(i=1;i<n;i++) { min=1001; for(j=1;j<=n;j++) { if(!vset[j]&&lowcost[j]<min&&lowcost[j]>0) { min=lowcost[j]; k=j; } } vset[k]=1; sum+=min; for(j=1;j<=n;j++) { if(!vset[j]&&lowcost[j]>map[k][j]&&map[k][j]>0) { lowcost[j]=map[k][j]; } } } printf( "%d\n" , sum ); } return 0; }
Kruscal实现
#include <stdio.h> #include <queue> using namespace std; #define Maxv 100+5 typedef struct { int v1,v2,len; }Node; bool operator > ( Node a , Node b ) { if( a.len > b.len ) return true; return false; } int fa[Maxv]; int Getfa( int i ) { if( fa[i] == i ) return i; fa[i] = Getfa(fa[i]); return fa[i]; } int main() { int n,sum; priority_queue< Node,vector<Node>,greater<Node> > Q; //定义优先队列 int i,j,len; Node e; while( scanf( "%d" , &n ) && n ) { int m = n*(n-1)/2; while( !Q.empty() ) Q.pop(); while( m-- ) { scanf( "%d%d%d" , &i , &j , &len ); e.v1 = i , e.v2 = j , e.len = len; Q.push(e); //压入边信息 } for( i = 1 ; i <= n ; i++ ) fa[i] = i; //初始化父亲数组 sum = 0; while( Q.size() != 0 ) { Node e; e = Q.top(); //取出最小边 Q.pop(); if( Getfa(e.v1) != Getfa(e.v2) ) //查,若不相连,则并 { sum += e.len; fa[Getfa(e.v2)] = Getfa(e.v1); } } printf( "%d\n" , sum ); } return 0; }