【题解】 RQNOJ PID397 约会计划(模拟 并查集)

估计问题大部分集中在如何存储字符串,求并查集的过程。我们只需要手写一个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;
}

猜你喜欢

转载自blog.csdn.net/rem_inory/article/details/81152593