HDU 3974 Assign the task (并查集改编)

来源:互联网 发布:js中date.parse 编辑:程序博客网 时间:2024/05/17 19:57

链接:http://acm.hdu.edu.cn/showproblem.php?pid=3974

 

这道题目的意思是这样的:

给你一个N,说明有N个人

然后接下来N行是这些人的关系

两个数字表示后者是前者的boss

然后再给你一个M,说明下面有M种情形

遇到C,你就要输出当前C后面跟着的那个号数的经理当前在做的任务。

遇到T,例如:T 2 1,你就要把任务1给2经理,而且,他的下属都要马上更换成这个任务。

 

所以出现C的时候,有可能问的很后面的经理当前的任务。

处理的方法是延后标记

记下最后一次改变任务的父亲经理的任务

 

AC代码如下(有参考大神的,忘记是哪位了,如果有看到神似的话,请不要喷,这里道歉下):

#include <stdio.h>#include <iostream>using namespace std;const int MAX = 50010;struct NODE{int task,count;};NODE p[MAX];int parent[MAX];void init(){memset(parent,-1,sizeof(parent));}int main(){int ncases,n,u,v,m,x,task;char s[5];scanf("%d",&ncases);int ind=1;while(ncases--){scanf("%d",&n);init();int i;for(i=0;i<n-1;i++){scanf("%d%d",&u,&v);parent[u]=v;}for(i=1;i<=n;i++){p[i].task=-1;p[i].count=-1;}scanf("%d",&m);printf("Case #%d:\n",ind++);int count=0;while(m--){scanf("%s",s);if(s[0]=='T'){scanf("%d%d",&x,&task);p[x].task=task;p[x].count=++count;}else{scanf("%d",&x);task=p[x].task;int count=p[x].count;while(x!=-1){if(p[x].count>count){task=p[x].task;count=p[x].count;}x=parent[x];}printf("%d\n",task);}}}return 0;}