[usaco3.1.1]agrinet
是一道最小生成树的模板题,顺便学习了一下刘汝佳大大的间接排序和Kruskal算法。
/* ID:abc31261 LANG:C++ TASK:agrinet */ #include<cstdio> #include<cstring> #include<algorithm> #include<iostream> using namespace std; const int maxn=11111; int r[maxn],f[maxn],w[maxn],u[maxn],v[maxn]; int cmp(const int i,const int j){ return w[i]<w[j]; } //间接排序 int find(int x) { if (f[x]!=x)f[x]=find(f[x]); return f[x]; } int main() { int i,j,l,x,y,n,m=0,ans=0; freopen("agrinet.in","r",stdin); freopen("agrinet.out","w",stdout); scanf("%d",&n); for (i=1;i<=n;i++) for (j=1;j<=n;j++) { scanf("%d",&l); w[++m]=l; u[m]=i; v[m]=j; } for (i=1;i<=m;i++)r[i]=f[i]=i; sort(r+1,r+m+1,cmp); for (i=1;i<=m;i++) { j=r[i]; x=find(u[j]); y=find(v[j]); if (x!=y) { ans+=w[j]; f[y]=x; } } printf("%d\n",ans); return 0; }