51 Nod 1640 天气晴朗的魔法( Kruskall )

 1 #include <bits/stdc++.h>
 2 typedef long long LL;
 3 using namespace std;
 4 const int maxn = 2e5+5;
 5 
 6 struct node{
 7     LL u,v,w;
 8     node(){}
 9     node(LL a,LL b,LL c):u(a),v(b),w(c){}
10 };
11 
12 LL f[maxn];
13 LL n,m;
14 vector<node>edge;
15 int Find(LL x)
16 {
17     if (f[x] != x)
18         f[x] = Find(f[x]);
19     return f[x];
20 }
21 
22 void Union(LL a, LL b)
23 {
24     int a1 = Find(a);
25     int b1 = Find(b);
26     if (a1 != b1)
27         f[a1] = b1;
28 }
29 bool cmp1(node a,node b)
30 {
31     return a.w>b.w;
32 }
33 bool cmp2(node a,node b)
34 {
35     return a.w<b.w;
36 }
37 int main()
38 {
39     ios::sync_with_stdio(false);
40     cin>>n>>m;
41     for(int i=1;i<=n;i++)
42         f[i]=i;
43     for(int i=0;i<m;i++){
44         LL a,b,c;
45         cin>>a>>b>>c;
46         edge.push_back(node(a,b,c));
47     }
48     sort(edge.begin(),edge.end(),cmp2);
49     LL k=0,max_num=-1;
50     for(int i=0;i<m;i++)
51     {
52         if(Find(edge[i].u)!=Find(edge[i].v))
53         {
54             Union(edge[i].u,edge[i].v);
55             max_num = max(max_num,edge[i].w);
56             k++;
57         }
58         if(k==(n-1))
59             break;
60     }
61     sort(edge.begin(),edge.end(),cmp1);
62     for(int i=1;i<=m;i++)
63         f[i]=i;
64     LL ans=0;
65     k=0;
66     for(int i=0;i<m;i++)
67     {
68         if(edge[i].w>max_num)continue;
69         if(Find(edge[i].u)!=Find(edge[i].v))
70         {
71             Union(edge[i].u,edge[i].v);
72             ans += edge[i].w;
73             k++;
74         }
75         if(k==(n-1))
76             break;
77     }
78     cout<<ans<<endl;
79     return 0;
80 }

 

posted @ 2018-09-03 20:18  ouyang_wsgwz  阅读(178)  评论(0编辑  收藏  举报