【洛谷 P2256】一中校运会之百米跑
题目:
思路:
这是一道并查集水题,适合初学者做!!!
若不会并查集的点我,那是dalao的博客!
本题难点:名字是字符串,要字符串处理
给每个名字一个编号,如\(1,2,3,4,5,6,...\),用\(\texttt{STL的map}\)存下来,然后普通并查集
这题是C++福利啦~
Pascal不知道数组下标能不能用字符串,可以的话一个数组搞定
代码:
拒绝+C
c++代码
#include <iostream>
using namespace std;
map <string,int> ma;
int f[20010],tot,n,m;
int find(int k){ //并查集find()
if(f[k]==k)return k;
return f[k]=find(f[k]);
}
int main()
{
//*****初始化*****
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)f[i]=i;
//*****存名字*****
for(int i=1;i<=n;i++)
{
string s;
cin>>s;
tot++;
ma[s]=tot;
}
//*****并*****
for(int i=1;i<=m;i++)
{
string s,st;
cin>>s>>st;
int a=ma[s],b=ma[st];
f[find(a)]=find(b);
}
//*****查*****
scanf("%d",&m);
for(int i=1;i<=m;i++)
{
string s,st;
cin>>s>>st;
int a=ma[s],b=ma[st];
if(find(a)==find(b))cout<<"Yes.\n";
else cout<<"No.\n";
}
return 0;
}