hdu3172:Virtual Friends

来源:互联网 发布:昆明搜索引擎优化网站 编辑:程序博客网 时间:2024/05/07 20:13

蛮简单的并查集

注意 若map中不存在对应的字符串到整数的映射

则默认映射为0


#include<stdio.h>#include<string.h>#include<algorithm>#include<map>#define maxn 111111using namespace std;int fa[maxn];char a[maxn][30];char b[maxn][30];int big[maxn];void init(){        int i;        for(i=0;i<=maxn;i++)                fa[i]=i;}int seek(int x){        return fa[x]==x?x:fa[x]=seek(fa[x]);}void Merge(int u ,int v){    int fu = seek(u);    int fv = seek(v);    if(fu != fv) {           fa[fv] = fu ;           big[fu] += big[fv];           big[fv] = 0 ;    }}int main(){        int t,n,i;        map<string,int> cnt;        while(scanf("%d",&t)!=EOF)        {        while(t--)        {                init();                //memset(big,1,sizeof(big));                scanf("%d",&n);                cnt.clear();                 for(i=0;i<=maxn;i++)            {                //fa[i]=i;                big[i]=1;            }                int tot=1;//一开始赋成了0,则第一个数等于没有映射                for(i=0;i<n;i++)                {                        scanf("%s",a[i]);                        if(!cnt[a[i]])                                cnt[a[i]]=tot++;                        //printf("Jesus1\n");                        scanf("%s",b[i]);                        if(!cnt[b[i]])                                cnt[b[i]]=tot++;                        //printf("Jesus2\n");                        int aa=cnt[a[i]];                        int bb=cnt[b[i]];                        //printf("Jesus3\n");                        Merge(aa,bb);                       // printf("Jesus4\n");                        int ans=seek(aa);                        printf("%d\n",big[ans]);        }}        }        return 0;}


0 0
原创粉丝点击