SDUT 2144 图结构练习——最小生成树
果然复习期间一个题都没敲就是手生了。
一定要记得啊:重复边保存最小的!!!
一开始还是没想到这个,最后忍无可忍动用了模版也没过才想到....
prim算法代码操作就不说了,直接上代码:
#include <stdio.h> #include <string.h> #define typec int // type of cost const typec inf = 0x3f3f3f3f; // max of cost #define V 105 int vis[V],dis[V][V]; typec lowc[V]; typec prim(typec cost[][V], int n) // vertex: 0 ~ n-1 { int i, j, p; typec minc, res = 0; memset(vis, 0, sizeof(vis)); vis[0] = 1; for (i=1; i<n; i++) { lowc[i] = cost[0][i]; } for (i=1; i<n; i++) { minc = inf; p = -1; for (j=0; j<n; j++) { if (0 == vis[j] && minc > lowc[j]) { minc = lowc[j]; p = j; } } if (inf == minc) { return -1; // 原图不连通 } res += minc; vis[p] = 1; for (j=0; j<n; j++) { if (0 == vis[j] && lowc[j] > cost[p][j]) { lowc[j] = cost[p][j]; } } } return res; } int main() { int m,n,i,j,x,y,w; while(scanf("%d%d",&n,&m)!=EOF) { for(i=0;i<n;i++) { for(j=0;j<n;j++) { if(i==j) { dis[i][j]=0; } else { dis[i][j]=inf; } } } for(i=0;i<m;i++) { scanf("%d%d",&x,&y); scanf("%d",&w); if(dis[x-1][y-1]>w) { dis[y-1][x-1]=w; dis[x-1][y-1]=w; } } printf("%d\n",prim(dis,n)); } }