思路:prime,考虑重边!!!
#include<stdio.h> #include<string.h> int map[1001][1001],dist[1001]; int vis[1001],n; void init1() { int i,j; for(i = 0;i < n;i ++) { for(j = 0;j < n;j ++) { if(i != j) map[i][j] = 1 << 30; } } } void init2() { int i; memset(vis,0,sizeof(vis)); for(i = 0;i < n;i ++) dist[i] = map[0][i]; } int main() { int m,i,j,k,cnt; int min,len,sum,a,b; while(~scanf("%d%d",&n,&m)) { init1(); sum = cnt = 0; while(m--) { scanf("%d%d%d",&a,&b,&len); if(len < map[a][b]) map[a][b] = map[b][a] = len; } init2(); vis[0] = 1; for(i = 0;i < n;i ++) { min = 1 << 30; for(j = 0;j < n;j ++) { if(!vis[j] && min > dist[j]) { min = dist[j]; k = j; } } vis[k] = 1; if(min != 1 << 30) { cnt++; sum += min; } for(j = 0;j < n;j ++) { if(!vis[j] && dist[j] > map[k][j]) dist[j] = map[k][j]; } } if(cnt == n-1) printf("%d ",sum); else printf("impossible "); } return 0; }