是一道最小生成树的模板题,顺便学习了一下刘汝佳大大的间接排序和Kruskal算法。
1 /* 2 ID:abc31261 3 LANG:C++ 4 TASK:agrinet 5 */ 6 #include<cstdio> 7 #include<cstring> 8 #include<algorithm> 9 #include<iostream> 10 using namespace std; 11 const int maxn=11111; 12 int r[maxn],f[maxn],w[maxn],u[maxn],v[maxn]; 13 14 int cmp(const int i,const int j){ return w[i]<w[j]; }{间接排序} 15 16 int find(int x) 17 { 18 if (f[x]!=x)f[x]=find(f[x]); 19 return f[x]; 20 } 21 int main() 22 { 23 int i,j,l,x,y,n,m=0,ans=0; 24 freopen("agrinet.in","r",stdin); 25 freopen("agrinet.out","w",stdout); 26 scanf("%d",&n); 27 for (i=1;i<=n;i++) 28 for (j=1;j<=n;j++) 29 { 30 scanf("%d",&l); 31 w[++m]=l; 32 u[m]=i; 33 v[m]=j; 34 } 35 for (i=1;i<=m;i++)r[i]=f[i]=i; 36 sort(r+1,r+m+1,cmp); 37 for (i=1;i<=m;i++) 38 { 39 j=r[i]; x=find(u[j]); y=find(v[j]); 40 if (x!=y) 41 { 42 ans+=w[j]; 43 f[y]=x; 44 } 45 } 46 printf("%d\n",ans); 47 return 0; 48 }
时间: 2024-09-30 23:28:03