[洛谷3366]【模板】最小生成树

思路:Kruskal

 1 #include<cstdio>
 2 #include<utility>
 3 #include<algorithm>
 4 #define w first
 5 #define a second.first
 6 #define b second.second
 7 const int N=5001;
 8 typedef std::pair<int,std::pair<int,int> > Edge;
 9 class UnionFindSet {
10     private:
11         int anc[N];
12     public:
13         UnionFindSet(int n) {
14             for(int i=1;i<=n;i++) anc[i]=i;
15         }
16         int Find(int x) {
17             return (x==anc[x])?x:(anc[x]=Find(anc[x]));
18         }
19         void Union(int x,int y) {
20             anc[Find(y)]=Find(x);
21         }
22 };
23 int main() {
24     int n,m;
25     scanf("%d%d",&n,&m);
26     Edge e[m];
27     for(int i=0;i<m;i++) scanf("%d%d%d",&e[i].a,&e[i].b,&e[i].w);
28     std::sort(&e[0],&e[m]);
29     UnionFindSet s(n);
30     int ans=0,area=n;
31     for(int i=0;i<m;i++) {
32         if(s.Find(e[i].a)==s.Find(e[i].b)) continue;
33         ans+=e[i].w;
34         s.Union(e[i].a,e[i].b);
35         area--;
36         if(area==1) {
37             printf("%d\n",ans);
38             return 0;
39         }
40     }
41     puts("orz");
42     return 0;
43 }

 

posted @ 2017-06-04 15:11  skylee03  阅读(110)  评论(0编辑  收藏  举报