题目链接:点
/* Date:22.9.2013 还是畅通工程 裸的Prim. 还没有学习Kruscal.明天学习!! 比较prim和Kruscal的区别. */ #include<stdio.h> #include<string.h> #define Max 105 #define INF 0xffffff //一般用三个数组Map邻接矩阵用来存储两个结点之间的权值. // Lowcost用来存储和i相连的最小权值. // vis(bool)用来存储i是否被链接. //一般有两个步骤吧! int Map[Max][Max],Lowcost[Max]; int Prim(int v0,int n) { //第一步:初始化.需要注意的是可以以任意一结点开始. bool vis[n];vis[v0]=true; for(int i=1;i<=n;i++) if(i!=v0) { Lowcost[i]=Map[v0][i]; vis[i]=false; } int Sum=0; //第二步:贪心选择. for(int i=1;i<=n;i++) { int temp=INF; int t=v0; for(int j=1;j<=n;j++) if(!vis[j]&&Lowcost[j]<temp) { temp=Lowcost[j]; t=j; } if(t==v0) return Sum; Sum+=temp; vis[t]=true; //Lowcost每次都要更新,Lowcost每次选择时都的最新的数据. //即已经选入的点和没选入点最小权值. for(int j=1;j<=n;j++) if(!vis[j]&&Lowcost[j]>Map[t][j]) Lowcost[j]=Map[t][j]; } } int main() { int N; while(scanf("%d",&N)&&N) { memset(Map,'a',sizeof(Map)); int a,b,c; for(int i=1;i<=N*(N-1)/2;i++) { scanf("%d%d%d",&a,&b,&c); Map[a][b]=c; Map[b][a]=c; } printf("%d\n",Prim(1,N)); } }