【最小生成树】kruskal模板

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 const int maxx=0x3f3f3f3f;
 4 const int maxn=10000;
 5 struct node
 6 {
 7     int u,v,l;
 8     bool operator <(const node &a)const
 9     {
10         return l<a.l;
11     }
12 }edge[maxn];
13 int father[maxn];
14 int nodenum,edgenum;
15 void init()
16 {
17     for(int i=0;i<nodenum;i++)
18     {
19         father[i]=i;
20     }
21 }
22 int Find(int x)
23 {
24     while(father[x]!=x)
25     {
26         x=father[x];
27     }
28     return x;
29 }
30 void Union(int x,int y)
31 {
32     int temp_x=Find(x);
33     int temp_y=Find(y);
34     if(temp_x!=temp_y)
35     {
36         father[temp_x]=temp_y;
37     }
38 }
39 int kruskal()
40 {
41     sort(edge,edge+edgenum);
42     init();
43     node now;
44     int ans=0;
45     for(int i=0;i<edgenum;i++)
46     {
47         now=edge[i];
48         if(Find(now.u)!=Find(now.v))
49         {
50             Union(now.u,now.v);
51             ans+=now.l;
52         }
53     }
54     return ans;
55 }
56 int main()
57 {
58     while(scanf("%d %d",&edgenum,&nodenum)&&edgenum)
59     {
60         for(int i=0;i<edgenum;++i)
61         {
62             scanf("%d %d %d",&edge[i].u,&edge[i].v,&edge[i].l);
63         }
64         int ans=kruskal();
65         bool flag=0;
66         for(int i=2;i<=nodenum;i++)
67         {
68             if(Find(1)!=Find(i))
69             {
70                 flag=1;
71                 break;
72             }
73         }
74         if(flag)
75         {
76             cout<<"?"<<'\n';
77         }
78         else
79         {
80             cout<<ans<<'\n';
81         }
82     }
83     return 0;
84 }

猜你喜欢

转载自www.cnblogs.com/guanwen769aaaa/p/11243387.html