题解 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;
}
任何一个伟大的计划,都有一个微不足道的开始