hdu3974Assign the task

View Code
/*hdu3974Assign the task
并查集
建立集合:v u表示v是u的下属
T x y 当x被分配到y任务时,他和下属的任务立刻变更为y
C x 询问x当前所分配的任务

task[i]表示i最后直接接到分配的任务 num[i]表示i接到任务的序号
当询问x时 只要找到祖先中最迟分配到的任务,即num[i]最大相对应的task[i]
*/
#include
<iostream>
#include
<algorithm>
using namespace std;
const int maxn=50001;
int pre[maxn],vis[maxn],task[maxn];
int find(int x)
{
int ans=task[x],t=vis[x];
int r=x;
while(pre[r]!=r)
{
int pa=pre[r];
if(t<vis[pa])
{
ans
=task[pa];
t
=vis[pa];
}
r
=pre[r];
}
return ans;

}
int main()
{
int cas,Cas=0;
cin
>>cas;
while(cas--)
{
int n,v,u;
cin
>>n;
memset(vis,
0,sizeof(vis));
memset(task,
-1,sizeof(task));
for(int i=1;i<=n;i++)pre[i]=i;
for(int i=1;i<n;i++)
{
cin
>>v>>u;
pre[v]
=u;
}
int num=0;
int m,x,y;
cin
>>m;
char ch;
cout
<<"Case #"<<++Cas<<":"<<endl;
for(int i=0;i<m;i++)
{
cin
>>ch;
if(ch=='T')
{
cin
>>x>>y;
task[x]
=y;
vis[x]
=++num;
}
else
{
cin
>>x;
cout
<<find(x)<<endl;
}
}
}
}

原文地址:https://www.cnblogs.com/sook/p/2158991.html