首先,贴上一个很好的讲解贴:
http://www.wutianqi.com/?p=3012
HDOJ 1233 还是畅通工程
http://acm.hdu.edu.cn/showproblem.php?pid=1233
裸的Prim...
1 #include<cstdio> 2 #define MAXN 105 3 #define INF 0x3f3f3f3f 4 int map[MAXN][MAXN]; 5 int dist[MAXN]; 6 int vis[MAXN]; 7 int n,a,b,x,ans,tot; 8 void init() 9 { 10 for(int i=1;i<=n;i++) 11 { 12 for(int j=1;j<=n;j++) 13 { 14 if(i==j) map[i][j]=0; 15 else map[i][j]=INF; 16 } 17 vis[i]=0; 18 dist[i]=INF; 19 } 20 } 21 void Prim() 22 { 23 tot=0;ans=0; 24 for(int i=1;i<=n;i++) 25 { 26 if(map[1][i]<INF) 27 dist[i]=map[1][i]; 28 } 29 vis[1]=1; 30 int tmp,u=1,flag; 31 for(int i=1;i<=n;i++) 32 { 33 tmp=INF;flag=0; 34 for(int j=1;j<=n;j++) 35 { 36 if(!vis[j]&&dist[j]<tmp) 37 { 38 flag=1; 39 tmp=dist[j]; 40 u=j; 41 } 42 } 43 vis[u]=1; 44 if(flag) ans+=dist[u]; 45 for(int j=1;j<=n;j++) 46 { 47 if(!vis[j]&&map[u][j]<dist[j]) 48 dist[j]=map[u][j]; 49 } 50 } 51 } 52 int main() 53 { 54 while(scanf("%d",&n)!=EOF) 55 { 56 if(n==0) break; 57 init(); 58 for(int i=0;i<n*(n-1)/2;i++) 59 { 60 scanf("%d%d%d",&a,&b,&x); 61 if(map[a][b]>x)//可能有重边,要取最小的,开始没加这个WA 62 { 63 map[a][b]=x; 64 map[b][a]=x; 65 } 66 } 67 Prim(); 68 printf("%d\n",ans); 69 } 70 return 0; 71 }