Online Judge | Problem Set | Authors | Online Contests | User | ||||||
---|---|---|---|---|---|---|---|---|---|---|
Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest |
第三十题留念#include<cstdio> #include<cstring> #include<cstdlib> #include<iostream> #include<algorithm> #include<cmath> using namespace std; #define N 150 #define M 21000 int n; struct arr{ int ff,tt,ww; }c[M]; int r[M]; int f[N]; int tot = 0; inline void add(int x,int y,int z){ c[++tot].ff = x; c[tot].tt = y; c[tot].ww = z; return; } bool comp(const int a,const int b){ return c[a].ww < c[b].ww; } int find(int x){ return f[x] == x ? x:f[x] = find(f[x]); } int kruscal(){ int ans = 0; for (int i = 1; i<=n; i++) f[i] = i; for (int i = 1; i<=tot; i++) r[i] = i; sort(r + 1,r + 1 + tot,comp); for (int i = 1; i<=tot; i++){ int y = r[i]; int fx = find(c[y].ff); int fy = find(c[y].tt); if (fx != fy){ ans += c[y].ww; f[fx] = fy; } } return ans; } int main(){ while (scanf("%d",&n) != EOF){ int w; memset(c,0,sizeof(c)); for (int i = 1; i<=n; i++){ for (int j = 1; j<=n; j++){ scanf("%d",&w); if (i < j) add(i,j,w); } } printf("%d\n",kruscal()); } return 0; } Followed by:
Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator