首页 > 代码库 > [洛谷3366]【模板】最小生成树

[洛谷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 }

 

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