HDU 3974 Assign the task 并查集

来源:互联网 发布:数据库系统工程师书籍 编辑:程序博客网 时间:2024/06/05 15:52

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

题目大意:

一个公司有N个员工,对于每个员工,如果他们有下属,那么他们下属的下属也是他的下属。

公司会给员工安排任务,分配给一个员工后,他也会把这个任务分配给下属。被分配到任务的人立刻停止 当前在做的工作,接受新的任务。

对于给定的M个操作

C x  输出编号为x的任务

T x y  分配任务y给x


思路:

并查集的实现,分配我们只记录在上司结点里,只不过查询的时候要把它的所有上司全部找一遍。


#include<cstdio>#include<iostream>using namespace std;const int MAXN=50001;int fa[MAXN];int val[MAXN];int time[MAXN];int main(){int T;scanf("%d",&T);for(int ri=1;ri<=T;ri++){int n;scanf("%d",&n);for(int i=1;i<=n;i++){fa[i]=i;val[i]=-1;time[i]=-1;}for(int i=1;i<n;i++){int a,b;scanf("%d%d",&a,&b);fa[a]=b;}printf("Case #%d:\n",ri);int m,cnt=0;scanf("%d",&m);char cmd;while(m--){cin>>cmd;if(cmd=='C'){int x;scanf("%d",&x);int cur=x,ans=val[cur],lastt=-1;while(cur != fa[cur]){if(time[cur] > lastt)//后加入的{lastt=time[cur];ans=val[cur];}cur=fa[cur];}if(time[cur] > lastt)//后加入的{lastt=time[cur];ans=val[cur];}printf("%d\n",ans);}else{int x,y;scanf("%d%d",&x,&y);val[x]=y;time[x]=cnt++;}}}return 0;}


5 0
原创粉丝点击