最小生成樹-HDU1233 克魯斯卡爾演算法 模板
阿新 • • 發佈:2018-11-13
題意就是給你一個圖,然後算這個圖衍生的最小生成樹
簡直就是模板題
程式碼:
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> using namespace std; const int maxn=110; const int maxm=5e3; int pre[maxn]; int n,m; int sum; struct E { int x,y,cost; }edg[maxm]; bool com(E a,E b) { return a.cost<b.cost; } int find(int x) { if(pre[x]==x) return x; return pre[x]=find(pre[x]); } int join(int x,int y) { int fx=find(x),fy=find(y); if(fx!=fy) { pre[fx]=fy; return 1; } return 0; } void kru() { sort(edg+1,edg+m+1,com); for(int i=1;i<=m;i++) { int res=join(edg[i].x,edg[i].y); if(res==1) sum+=edg[i].cost; } } void ini() { for(int i=1;i<=n;i++) pre[i]=i; sum=0; } int main() { while(scanf("%d",&n)!=EOF&&n) { ini(); m=n*(n-1)/2; for(int i=1;i<=m;i++) { int x,y,z; scanf("%d %d %d",&edg[i].x,&edg[i].y,&edg[i].cost); } kru(); cout<<sum<<endl; } return 0; }