本文主要是介绍hihocode的并查集map,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
题目意思:0代表name1和name2是伙伴,1代表查询name1和name2是否是伙伴。
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<vector>
#include<queue>
#include<map>
#include<stack>
#define rt return
#define bk break
#define ct continue
#define sf scanf
#define pf printf
#define ms memset
#define si(n) sf("%d",&n)
#define pi(n) pf("%d",n)
#define REP0(i,n) for(int i=0;i<(n);i++)
#define REP1(i,n) for(int i=1;i<=(n);i++)
#define REP(i,s,n) for(int i=s;i<=(n);i++)
#define db double
#define pb push_back
#define LL long long
#define INF 0x3fffffff
#define eps 1e-8
#define PI acos(-1)
#define maxn 100010
using namespace std;
map <string,int>mapt;
int f[maxn];
int find(int x){if(f[x]==x)rt x;rt f[x]=find(f[x]);
}
void merge(int a,int b){int x=find(a);int y=find(b);f[y]=x;
}
int main(){#ifdef ACBangfreopen("in.txt","r",stdin);#endiffor(int i=0;i<maxn;i++)f[i]=i;int n;sf("%d",&n);int cnt=1;while(n--){int k;string s1,s2;cin>>k>>s1>>s2;if(k==0){if(mapt.find(s1)==mapt.end())mapt[s1]=cnt++;if(mapt.find(s2)==mapt.end())mapt[s2]=cnt++;merge(mapt[s1],mapt[s2]);}else{if(mapt.find(s1)==mapt.end()||mapt.find(s2)==mapt.end() ){puts("no");continue;}int x=find(mapt[s1]);int y=find(mapt[s2]);
// cout<<mapt[s1]<<" "<<mapt[s2]<<endl;
// cout<<x<<" "<<y<<endl;if(x==y)puts("yes");else puts("no");}}rt 0;
}
这篇关于hihocode的并查集map的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!