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 |
Re:这个可以启发式么?In Reply To:这个可以启发式么? Posted by:lostoy at 2011-07-12 12:09:23 > 导论里最后有一个比这个稍复杂点的,说可以启发式,这个可以么? 可以. 弱弱的代码 #include <iostream> #include <cstdio> #include <string> #include <cstdlib> #include <algorithm> #include <cstring> #include <map> #include <set> using namespace std; const int N = 30001; const int M = 100001; int nele[N]; int par[N]; int lenbtm[N]; int findset(int x){ if(par[x]!=x){ int rt = findset(par[x]); if(rt!=par[x]){ lenbtm[x] += lenbtm[par[x]]; } par[x] = rt; } return par[x]; } void unionset(int topset, int btmset){ if(nele[topset]>nele[btmset]){ lenbtm[topset] += nele[btmset]; lenbtm[btmset] -= lenbtm[topset]; par[btmset] = topset; nele[topset] += nele[btmset]; } else { lenbtm[topset] = lenbtm[topset] + nele[btmset] - lenbtm[btmset]; par[topset] = btmset; nele[btmset] += nele[topset]; } } int main(){ for(int i=1;i<=N;++i){ par[i] = i; lenbtm[i] = 0; nele[i] = 1; } int m; scanf("%d", &m); char op[3]; for(int i=0;i<m;++i){ scanf("%s", op); if(op[0]=='M'){ int x,y; scanf("%d%d", &x, &y); int ts = findset(x); int bs = findset(y); unionset(ts,bs); } else { int x; scanf("%d", &x); int res; int xset = findset(x); if(xset==x) res = lenbtm[x]; else res = lenbtm[x]+lenbtm[xset]; printf("%d\n", res); } } } Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator