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 <iostream> #include <cstring> #include <algorithm> #include <cmath> using namespace std; const int maxx = 500; struct node { int l,r,value; } q[50000],fei[maxx]; int fa[maxx]; int n,m; void init() { for(int i=0; i<=n+10; i++) fa[i]= i; } bool cmd(node a,node b) { return a.value < b.value; } int Find(int x) { if (x != fa[x]) fa[x] = Find(fa[x]); return fa[x]; } bool Union(int x,int y) { int xx = Find(x); int yy = Find(y); if (xx != yy) { fa[xx] = yy; return true; } return false; } int main() { int t,ans,ano,l; bool vis,temp; cin>>t; while(t--) { l=0; cin>>n>>m; init(); for(int i=0; i<m; i++) scanf("%d%d%d",&q[i].l,&q[i].r,&q[i].value); sort(q,q+m,cmd); ans = 0; for(int i=0; i<m; i++) if (Union(q[i].l,q[i].r)) { ans += q[i].value; fei[l].l = q[i].l; fei[l].r = q[i].r; l++; } vis = temp = true; for(int i=0; i<l; i++) { init(); ano = 0; for(int j=0; j<m; j++) if ( q[j].l != fei[i].l || q[j].r != fei[i].r ) if (Union(q[j].l,q[j].r)) ano += q[j].value; if (ano == ans) { for(int k=1; k<n; k++) if (Find(k) != Find(k+1)) { vis = false; break; } if (vis) temp = false; } if (!temp) break; } if (temp) cout<<ans<<endl; else puts("Not Unique!"); } return 0; } Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator