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<iostream> #include<cstdio> #include<algorithm> using namespace std; long long sum; int root[20005]; int Find(int x) { if (x!=root[x]) root[x]=Find(root[x]); return root[x]; } void Merger(int a,int b) { int r1=Find(a); int r2=Find(b); if (r1!=r2) root[r1]=r2; } struct edge { int a,b,c; bool operator < (edge t) const { return c<t.c; } } rr[50005]; int main() { int n,m,r,x,y,d; int t; cin>>t; while(t--) { //printf("\n"); 此处被坑 scanf("%d%d%d",&n,&m,&r); sum=0; for (int i=0; i<n+m; ++i) root[i]=i; for (int i=0; i<r; ++i) { scanf("%d%d%d",&x,&y,&d); rr[i].a=x,rr[i].b=y+n,rr[i].c=10000-d; } sort(rr,rr+r); // for (int i=0;i<r;++i) // cout<<"##"<<rr[i].a<<' '<<rr[i].b<<' '<<rr[i].c<<endl; int cnt=0; for (int i=0; i<r; ++i) { if (Find(rr[i].a)!=Find(rr[i].b)) { // cout<<"++++"<<rr[i].a<<' '<<rr[i].b<<endl; cnt++; sum+=rr[i].c; Merger(rr[i].a,rr[i].b); if (cnt==m+n-1) break; } } // for (int i=0;i<m+n;++i) // cout<<"i="<<i<<' '<<"root[i]="<<root[i]<<endl; for (int i=0; i<m+n; ++i) if (root[i]==i) sum+=10000; printf("%lld\n",sum); } } Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator