http://acm.nuaa.edu.cn/acmhome/problemdetail.do?&method=showdetail&id=1013 最小生成树 代码 #include<iostream> #include<algorithm> using namespace std; #define MAX 5003 int u[MAX],v[MAX],w[MAX],p[MAX],r[MAX]; int n; void init(){ int i,j;int m=0;int ss; for(i=0;i<n;++i){ for(j=0;j<n;++j) if(i>j){ u[m]=i;v[m]=j; cin>>w[m];m++; } else cin>>ss; } } int cmp(const int i,const int j){ return w[i]<w[j]; } int find(int x){ return p[x]==x?x:p[x]=find(p[x]); } int kruskal(){ int ans=0;int i;int m=(n*n-n)/2; for(i=0;i<n;++i)p[i]=i; for(i=0;i<m;++i)r[i]=i; sort(r,r+m,cmp); for(i=0;i<m;++i){ int e=r[i];int x=find(u[e]),y=find(v[e]); if(x!=y){ ans+=w[e];p[x]=y; } }return ans; } int main(int argc, char *argv[]) { while(cin>>n){ init(); cout<<kruskal()<<endl; } return 0; }