hdu3635(并查集)

来源:互联网 发布:java培训那家口碑最高 编辑:程序博客网 时间:2024/05/16 07:38

这道题的难点在于如何记录转移的次数,我们可以想到find函数里面会遍历到根节点的translate次数,所以,我们可以在find的时候修改访问的值。

其他没有什么难点,简单的并查集处理就好

#include <iostream>#include <cstdio>#include <cstdlib>#include <cstring>#include <map>#include <algorithm>#include <cmath>#include <vector>#define N 10005using namespace std;int m,n,G[N],Rank[N],tran[N];int Find(int x){    if(G[x]==x) return x;    else    {        int m=G[x];        G[x]=Find(G[x]);        tran[x]+=tran[m];        return G[x];    }}void Set(){    int i;    for(i=1;i<=n;i++)    {        G[i]=i;        Rank[i]=1;        tran[i]=0;    }}void translate(int a,int b){    int p=Find(a),q=Find(b);    if(p==q) return;    G[p]=q;    Rank[q]+=Rank[p];    Rank[p]=0;    tran[p]++;}int main(){    int T,i,p,q,num=0;    char ch[10];    scanf("%d",&T);    while(T--)    {        scanf("%d %d",&n,&m);        printf("Case %d:\n",++num);        Set();        for(i=0;i<m;i++)        {            scanf("%s",ch);            if(ch[0]=='T')            {                scanf("%d %d",&p,&q);                translate(p,q);            }            else if(ch[0]=='Q')            {                scanf("%d",&p);                q=Find(p);                printf("%d %d %d\n",q,Rank[q],tran[p]);            }        }    }    return 0;}


0 0