POJ 1258(最小生成树kruskal模板)
#include <iostream> #include <cstdio> #include <cmath> #include <cstring> #include <algorithm> #include <queue> #include <stack> #include <vector> #include <iomanip> #include <map> using namespace std; const int mmax=200; struct node{ int a,b,price; }; int par[mmax],rank[mmax],n; vector<node>e; void init() { for(int i=0;i<=n;i++) { rank[i]=0; par[i]=i; } } int find(int x) { if(par[x]==x) return x; else return par[x]=find(par[x]); } void unite(int x,int y) { x=find(x); y=find(y); if(x==y) return; if(rank[x]<rank[y]) par[x]=y; else { par[y]=x; if(rank[x]==rank[y]) rank[x]++; } } bool cmp(node a,node b) { return a.price<b.price; } int main(int argc, char *argv[]) { int ans,cout; while(scanf("%d",&n)!=EOF) { cout=0; e.clear(); for(int i=0;i<n;i++) { for(int j=0;j<n;j++) { int t; scanf("%d",&t); if(i!=j) { node k; k.a=i; k.b=j; k.price=t; e.push_back(k); cout++; } } } sort(e.begin(),e.end(),cmp); init(); ans=0; int ne=0; for(int i=0;i<cout;i++) { if(find(e[i].a)!=find(e[i].b)) { unite(e[i].a,e[i].b); ans+=e[i].price; ne++; } } if(ne==n-1) printf("%d\n",ans); else printf("-1\n"); } return 0; }