hdu 3172 Virtual Friends

来源:互联网 发布:windows nc命令安装 编辑:程序博客网 时间:2024/05/16 09:54

acm.hdu.edu.cn/showproblem.php?pid=3172

萌萌哒并查集水题!唯一需要注意一点点的是使用map容器为名字赋予一个编号便于操作!

AC代码:

#include <algorithm>#include <iostream>#include <string.h>#include <stdio.h>#include <map>using namespace std;map <string, int> mm;const int MAX = 100010;char s1[MAX][25],s2[MAX][25];int father[MAX],rank[MAX];void Init(int n){    for(int i=1; i<=n; i++){        father[i] = i;        rank[i] = 1;    }}int Find(int x){    if(x != father[x])        father[x] = Find(father[x]);    return father[x];}void Union(int x, int y){    int xx = Find(x), yy = Find(y);    if(xx != yy){        father[yy] = xx;        rank[xx] += rank[yy];        // cout << x << ' ' << rank[x] << endl;    }}int main(){    int cas;     while(scanf("%d",&cas) != EOF){        while(cas--){            int n,pos = 0;             scanf("%d",&n);            mm.clear();            for(int i=0; i<n; i++){                scanf("%s%s",s1[i],s2[i]);                if(mm.find(s1[i]) == mm.end())                    mm[s1[i]] = ++pos;                if(mm.find(s2[i]) == mm.end())                    mm[s2[i]] = ++pos;            }            Init(pos);            for(int i=0; i<n; i++){                // cout << mm[s1[i]] << " " << mm[s2[i]] << endl;                Union(mm[s1[i]], mm[s2[i]]);                printf("%d\n",rank[Find(mm[s1[i]])]);            }        }    }    return 0;}


0 0