估计问题大部分集中在如何存储字符串,求并查集的过程。我们只需要手写一个get函数,遍历所有的字符串,找到某个字符串对应的序号存下来,然后求普通的并查集就行了,在合并和找父亲时对其序号进行操作。
#include<cstdio>
#include<iostream>
using namespace std;
const int maxn=2030;
int fa[maxn];
string a[maxn];
int n,m,p;
int find(int x)
{
if(fa[x]!=x) return find(fa[x]);
return fa[x];
}
void merge(int a,int b)
{
if(find(a)!=find(b))
{
fa[find(a)]=find(b);
}
}
int get(string s)
{
for(int i=1;i<=n;i++)
{
if(a[i]==s) return i;
}
}
int main()
{
cin>>n>>m>>p;
for(int i=1;i<=n;i++)
{
cin>>a[i];
}
for(int i=1;i<=n;i++)
{
fa[i]=i;
}
for(int i=1;i<=m;i++)
{
string x,y;
cin>>x>>y;
merge(get(x),get(y));
}
while(p--)
{
string x,y;
cin>>x>>y;
if(find(get(x))==find(get(y))) cout<<"safe"<<endl;
else cout<<"cc cry"<<endl;
}
return 0;
}