首页 > 代码库 > HDU 3635 Dragon Balls
HDU 3635 Dragon Balls
题意:
一开始每个城市里有一个龙珠 每次T操作使得A龙珠所在城市的所有龙珠飞到B龙珠所在城市 Q操作询问X龙珠在哪个城市 那个城市里有几个龙珠 X飞过几次
思路:
从T操作的功能来看想到并查集 即 每次找到所在城市(找根)飞到另一个城市(并集)
但是并查集无法统计每个龙珠飞过几次 这时候我们可以给并查集加上一个权值
每次飞的时候使A集合的权值++ 这样当询问X飞过几次的时候 只需要从X开始找根 并把路径上的权值求和即可
代码:
#include<cstdio> #include<cstring> #include<algorithm> using namespace std; #define N 11000 int num[N],mov[N],fa[N]; int T,t,n,m; int getf(int x) { if(x!=fa[x]) { int tmp=fa[x]; fa[x]=getf(fa[x]); mov[x]+=mov[tmp]; } return fa[x]; } int main() { int i,x,y,fx,fy; char op[10]; while(~scanf("%d",&T)) { for(t=1;t<=T;t++) { printf("Case %d:\n",t); scanf("%d%d",&n,&m); for(i=1;i<=n;i++) { num[i]=1; fa[i]=i; mov[i]=0; } while(m--) { scanf("%s",op); if(op[0]=='T') { scanf("%d%d",&x,&y); fx=getf(x); mov[fx]++; fy=getf(y); num[fy]+=num[fx]; num[fx]=0; fa[fx]=fy; } else if(op[0]=='Q') { scanf("%d",&x); fx=getf(x); printf("%d %d %d\n",fx,num[fx],mov[x]); } } } } return 0; }
HDU 3635 Dragon Balls
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。