HDOJ1863(prim)
1 #include <iostream> 2 #include <cstdio> 3 #include <cmath> 4 #include <cstring> 5 #include <algorithm> 6 #include <queue> 7 #include <stack> 8 #include <vector> 9 using namespace std; 10 const int N=300; 11 const int ma=100000000; 12 int main(int argc, char *argv[]) 13 { 14 int n,m,cost[N][N],d[N],vis[N],ans; 15 while(scanf("%d%d",&n,&m)!=EOF) 16 { 17 if(n==0) 18 break; 19 for(int i=1;i<m;i++) 20 { 21 for(int j=1;j<=m;j++) 22 { 23 if(i==j) 24 cost[i][j]=0; 25 else 26 cost[i][j]=ma; 27 } 28 } 29 for(int i=0;i<n;i++) 30 { 31 int a,b,c; 32 scanf("%d%d%d",&a,&b,&c); 33 cost[a][b]=c;cost[b][a]=c; 34 } 35 memset(d,0,sizeof(d)); 36 memset(vis,0,sizeof(vis)); 37 38 d[1]=0;ans=0; 39 for(int i=1;i<=m;i++) 40 { 41 d[i]=cost[1][i]; 42 } 43 44 for(int i=1;i<=m;i++) 45 { 46 int k; 47 int min=ma; 48 for(int j=1;j<=m;j++) 49 { 50 if(vis[j]==0&&d[j]<min) 51 { 52 k=j; 53 min=d[j]; 54 } 55 56 } 57 if(min==ma) 58 { 59 printf("?\n"); 60 ans=-1; 61 break; 62 } 63 vis[k]=1; 64 ans+=min; 65 for(int j=1;j<=m;j++) 66 { 67 if(vis[j]==0&&d[j]>cost[k][j]) 68 { 69 d[j]=cost[k][j]; 70 } 71 } 72 } 73 if(ans!=-1) 74 printf("%d\n",ans); 75 } 76 }