【洛谷 P2256】一中校运会之百米跑

题目:

题目

思路:

这是一道并查集水题,适合初学者做!!!

若不会并查集的点,那是dalao的博客!

本题难点:名字是字符串,要字符串处理

给每个名字一个编号,如\(1,2,3,4,5,6,...\),用\(\texttt{STL的map}\)存下来,然后普通并查集

这题是C++福利啦~

Pascal不知道数组下标能不能用字符串,可以的话一个数组搞定

代码:

拒绝ctrl+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;
}

posted @ 2019-07-23 01:13  Jayun  阅读(136)  评论(0编辑  收藏  举报