最基本的最小生成樹問題,這裏運用Kruskal算法求解。ios
早上順利回到了武漢,一下車,哎呀太熱了。。。算法
/* ID:jzzlee1 PROB:agrinet LANG:C++ */ //#include<iostream> #include<fstream> #include<string> #include<algorithm> #include<cstdio> using namespace std; ifstream cin("agrinet.in"); ofstream cout("agrinet.out"); int n,m,u[10010],v[10010],w[10010],p[110],r[10010]; 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 main() { int ans=0; cin>>n; m=n*n; int i,j,k=0; //第i條邊的兩個端點序號和權值分別保存在u[i],v[i]和w[i]中 for(i=0;i!=n;i++) for(j=0;j!=n;j++) { cin>>w[k]; u[k]=i; v[k]=j; k++; } 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]); int y=find(v[e]); //若是在不一樣集合,合併 if(x!=y) { ans+=w[e]; p[x]=y; } } cout<<ans<<endl; return 0; }