POJ 1258 Agri-Net
最小生成树。
#include<cstdio> #include<cstring> #include<cmath> #include<queue> #include<vector> #include<algorithm> using namespace std; const int maxn=150; int n; long long g[maxn][maxn]; struct X { int u,v; long long val; } e[maxn*maxn]; int f[maxn]; int Find(int x) { if(x!=f[x]) return f[x]=Find(f[x]); return f[x]; } bool cmp(const X&a,const X&b) { return a.val<b.val; } int main() { while(~scanf("%d",&n)) { for(int i=1; i<=n; i++) { for(int j=1; j<=n; j++) { scanf("%lld",&g[i][j]); } } for(int i=1; i<=n; i++) f[i]=i; int tot=0; for(int i=1; i<=n; i++) { for(int j=1; j<=n; j++) { if(i==j) continue; e[tot].u=i; e[tot].v=j; e[tot].val=g[i][j]; tot++; } } sort(e,e+tot,cmp); long long ans=0; for(int i=0; i<tot; i++) { int fx=Find(e[i].u); int fy=Find(e[i].v); if(fx!=fy) { f[fx]=fy; ans=ans+e[i].val; } } printf("%lld\n",ans); } return 0; }