hdu3172 Virtual Friends 并查集 map映射

来源:互联网 发布:淘宝怎么搜阿普唑仑 编辑:程序博客网 时间:2024/05/19 22:06

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3172

题目大意:给你N个社交网络圈,紧接着m个人的关系,每更新一个信息,输出当前两个人的朋友圈里有多少个朋友,多组测试数据。

解题思路:明显的并查集,但主要问题是吧名字转化成方便合并查找的数字,用map映射,代码如下:

#include<stdio.h>#include<map>#include<iostream>using namespace std;map<string,int> m;int f[100005],rank[100005];int find(int x){    if(x==f[x]) return x;    return f[x]=find(f[x]);}void init(){    for(int i=1;i<100005;i++)            {f[i]=i;rank[i]=1;}}void merge(int x,int y){    int fx=find(x);    int fy=find(y);    if(fx!=fy)    {        f[fx]=fy;        rank[fy]+=rank[fx];    }    printf("%d\n",rank[fy]);}int main(){    int t;    char a[25],b[25];    while(~scanf("%d",&t))    {        while(t--)        {            int n;            scanf("%d",&n);            init();            m.clear();//清空容器map            int ans=1;            for(int i=1; i<=n; i++)            {                scanf("%s%s",a,b);                if(!m[a])//如果没出现过,映射为ans,同时ans++                    m[a]=ans++;                if(!m[b])                    m[b]=ans++;                merge(m[a],m[b]);            }        }    }    return 0;}

其实这道题学到了map的一个小用法。。。

0 0