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 }

 

posted @ 2018-08-21 16:31  huluxin  阅读(115)  评论(0编辑  收藏  举报