1. 程式人生 > >[洛谷3366]【模板】最小生成樹

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

fine nds first 最小 fin print kruskal += sca

思路: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 }

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