HDU1863

注意Kruscal算法本身是个贪心,得到的是最小生成森林,因此最后看所有顶点是不是有相同的祖先即可,如果不是,输出"?"。

 1 #include<iostream>
 2 #include<algorithm>
 3 using namespace std;
 4 struct node{
 5     int from,to,w;
 6     bool operator < (const node &a){
 7         return w<a.w;
 8     }
 9 }a[10010];
10 int n,m,f[101],ans,flag;
11 
12 void ini(){
13     ans=0;
14     flag=1;
15     for (int i=1;i<=n;i++) f[i]=i;
16 }
17 
18 int getf(int u){
19     return u==f[u]?f[u]:f[u]=getf(f[u]);
20 }
21 
22 void merge(int u,int v){
23     f[getf(u)]=getf(v);
24 }
25 
26 void solve()
27 {
28     while (cin>>m){
29         if (m==0) break;
30         cin>>n;
31         ini();
32         for (int i=1;i<=m;i++) cin>>a[i].from>>a[i].to>>a[i].w;
33         sort(a+1,a+1+m);
34         for (int i=1;i<=m;i++){
35             if (getf(a[i].from)!=getf(a[i].to)){
36                 ans+=a[i].w;
37                 merge(a[i].from,a[i].to);
38             }
39         }
40         for (int i=1;i<=n && flag;i++){
41             if (getf(i)!=getf(1)) flag=0;
42         }
43         if (flag) cout<<ans<<endl;
44         else cout<<"?"<<endl;
45     }
46 }
47 
48 int main()
49 {
50     solve();
51     return 0;
52 }

 

posted @ 2020-05-01 10:58  White_Li  阅读(119)  评论(0)    收藏  举报