题解 P2256 【一中校运会之百米跑】

这道题的思路:map< string , int > + 并查集。

我们可以很容易想到,把在一个组织里的队员用并查集连接起来,然后统计有几个队伍。

在这里,我们可以直接统计 \(f[x]==x\) 的个数。

由于题目中给出的是字符串,所以我们要用一个 map 映射,直接将字符串转化成整型,相当于给每个人一个编号。

#include<bits/stdc++.h>
using namespace std;
map<string,int> m;//STL大法好
int f[20005];
int find(int x) {//并查集——找祖宗
	if(f[x]!=x) f[x]=find(f[x]);
	return f[x];
}
void merge(string a,string b) {//并查集——合并
	int x=m[a],y=m[b];
	x=find(x),y=find(y);
	if(x!=y) f[x]=y;
}
int main() {
	int n,mm,k;
	cin>>n>>mm;
	for(int i=1;i<=n;i++) {
		string name;
		cin>>name;
		m[name]=i;//转换成编号
		f[i]=i;//并查集初始化
	}
	for(int i=1;i<=mm;i++) {
		string name1,name2;
		cin>>name1>>name2;
		merge(name1,name2);
	}
	cin>>k;
	for(int i=1;i<=k;i++) {
		string name1,name2;
		cin>>name1>>name2;
		if(find(m[name1])!=find(m[name2]))//祖宗不同
        		puts("No.");//不在同一组织内
		else puts("Yes.");
	}
	return 0;
}

猜你喜欢

转载自www.cnblogs.com/ahawzlc/p/12636872.html