最小生成树
#include <iostream> #include <algorithm> const int N=10005; using namespace std; struct edge { int u,v,w; bool operator <(const edge &b)const { return this->w < b.w; } }e[N]; int par[N]; void init() { for(int i=0;i<N;i++) par[i]=i; } int Find(int x) { if(par[x]==x) return x; else return Find(par[x]); } int kruscal(int n,int m) { init(); sort(e,e+m); int ans=0; for(int i=0;i<m;i++){ int u=e[i].u,v=e[i].v,w=e[i].w; if(Find(u)==Find(v)) continue; par[Find(u)]=Find(v); ans+=w; } return ans; } int main() { std::ios::sync_with_stdio(false); int n,m; while(cin>>n&&n){ m=n*(n-1)/2; for(int i=0;i<m;i++) cin>>e[i].u>>e[i].v>>e[i].w; cout<<kruscal(n,m)<<endl; } return 0; }
#include <iostream> #include <algorithm> const int N=10005; using namespace std; struct edge { int u,v,w; }e[N]; int par[N]; bool cmp(edge a,edge b) { return a.w<b.w; } void init() { for(int i=0;i<N;i++) par[i]=i; } int Find(int x) { if(par[x]==x) return x; else return Find(par[x]); } int kruscal(int n,int m) { init(); sort(e,e+m,cmp); int ans=0; for(int i=0;i<m;i++){ int u=e[i].u,v=e[i].v,w=e[i].w; if(Find(u)==Find(v)) continue; par[Find(u)]=Find(v); ans+=w; } return ans; } int main() { std::ios::sync_with_stdio(false); int n,m; while(cin>>n&&n){ m=n*(n-1)/2; for(int i=0;i<m;i++) cin>>e[i].u>>e[i].v>>e[i].w; cout<<kruscal(n,m)<<endl; } return 0; }