hdu 3172 Virtual Friends (cmp + 並查集)

此題用一般的方法查找會超時,所以要用到cmp容器來查找;

對於cmp是一個會自動排序的容器,利用find函數可以快速查找是否含有某個數;

#include<stdio.h>
#include<string>
#include<iostream>
#include<map>
using namespace std;
map<string,int>A;
#define N 1000006
int pre[N];
int rank[N];   
int find(int k)
{
 if(k!=pre[k])
  pre[k]=find(pre[k]);
 return pre[k];
}
void Union(int x,int y)
{
 x=find(x);
 y=find(y);
 if(x!=y)
 {
  pre[y]=x;
  rank[x]+=rank[y];
 }
}
int main()
{
 int m,i,n,j,k,h;
 string a,b;
 while(scanf("%d",&k)!=EOF)
 {
  while(k--)
  {
   A.clear();
   n=0;
   scanf("%d",&m);
   while(m--)
   {
    cin>>a>>b;//這裏要注意,a,b不能用scanf輸入,只能用cin來輸入;
    if(A.find(a)==A.end())
    {
     
     A[a]=n;
     pre[n]=n;
     rank[n]=1;
     n++;
    }
    if(A.find(b)==A.end())如果A中不含b,則添加。
    {
     
     A[b]=n;
     pre[n]=n;
     rank[n]=1;
     n++;
    }
    Union(A[a],A[b]);
    printf("%d\n",rank[find(A[a])]);
   }
  }
 }
 return 0;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章