当前位置:首页 > 题解目录 > 正文内容

【题解】校运会

亿万年的星光3年前 (2023-04-13)题解目录2274

【题目描述】

校运会上,一共有N个参赛选手,已知N个选手的名字。然后老师告诉你M句话,话的内容是学生A与学生B在同一组里。如果学生A与学生B在同一组里,学生B与学生C也在同一组里,就说明学生A与学生C在同一组。

然后老师问你K句话,即学生X和学生Y是否在同一组里。若是,输出Yes,否则输出No。

22×104参赛选手。(尼玛全校学生都没这么多吧)

【输入描述】

第一行N和M。

接下来N行输入每一个同学的名字。

再往下M行每行输入两个名字,且保证这两个名字都在上面 N行中出现过,表示这两个参赛选手在同一个组里。

接下来输入K。

最后输入K个老师的询问。

【输出描述】

对于每一个循环,输出Yes或者No

【样例输入】

10 6
Jack
Mike
ASDA
Michel
brabrabra
HeHe
HeHE
papapa
HeY
Obama
Jack Obama
HeHe HeHE
brabrabra HeHe
Obama ASDA
papapa Obama
Obama HeHE
3
Mike Obama
HeHE Jack
papapa brabrabra

【样例输出】

No.
Yes.
Yes.

【数据范围】

2<=N<=2*10^4
1<=M<=10^6
1<=K<=10^6

【题目分析】

  • 并查集题目,问题就是如何表示字符串这个问题。


我们可以定义一个结构体,参考如下:

struct node{	
	string s; //姓名 
	int num;	//编号 
};

用s表示姓名,用num表示编号,然后左侧的圆圈表示当前这个人的下标。

那么,在以前中并查集中,我们的指向关系中,我们是p[4]=9,那么在结构体中,就是 p[x].num=p[y].num

通过上面这种指向关系确定父级和子级




【参考答案:结构体】

#include<bits/stdc++.h>
using namespace std;
int n,m,k;
struct node{	
	string s;     //姓名 
	int num;	//编号 
};
node p[20005]; 


//查找函数 
int find(int n){	 
	if(p[n].num==n) 
		return p[n].num;
	else  
		return 	p[n].num=find(p[n].num);

}
void merge(int a,int b){	//合并并查集 
	int fa=find(a);
	int fb=find(b);		
	if(fa==fb) return ;
	else p[fa].num=p[fb].num;
	return;
}
//查找这个名字 
int sfind(string a){
	for(int i=1;i<=n;i++){
		if(a==p[i].s) return i;
	}
}
int main(){
	cin>>n>>m;]
	//输入以及初始化 
	for(int i=1;i<=n;i++){
		cin>>p[i].s;	 
		p[i].num=i;
	}	
	//查找并合并 
	for(int i=1;i<=m;i++){
		string x,y;	
		cin>>x>>y;
		if(find(sfind(x))!=find(sfind(y))){	//查找两个名字
			merge(sfind(x),sfind(y));		//合并 
		}
	} 
	cin>>k;	 
	//k次询问 
	for(int i=1;i<=k;i++){	
		string x1,y1;
		cin>>x1>>y1;
		//查找两个名字
		if(find(sfind(x1))==find(sfind(y1))){	
			cout<<"Yes."<<endl;			
		}else {
			cout<<"No."<<endl;		 
		}
	}
	return 0;	
}


扫描二维码推送至手机访问。

版权声明:本文由青少年编程知识记录发布,如需转载请注明出处。

分享给朋友:

相关文章

【题解】上学线路(2019青岛市程序设计比赛)

【题解】上学线路(2019青岛市程序设计比赛)

 【题目描述】小D从家到学校的道路结构是这样的:由n条东西走向和m条南北走向的道路构成了一个n*m的网格,每条道路都是单向通行的(只能从北向南,从西向东走)。已知小D的家在网格的左上角,学校...

【题解】银行排队

【题目描述】我们大多都有在银行排队的经历,唉,那坑爹的排队啊!现在就让我们来算算我们这些客户平均需要等多久吧。每天刚开始时银行会开m个窗口来为我们total个客户办理业务,当有客户需要办理业务时,先选...

【题解】单词接龙

【题目描述】单词接龙是一个与我们经常玩的成语接龙相类似的游戏,现在我们已知一组单词,且给定一个开头的字母,要求出以这个字母开头的最长的“龙”(每个单词都最多在“龙”中出现两次),在两个单词相连时,其重...

【题解】老王赛马

【题目描述】赛马是一古老的游戏,早在公元前四世纪的中国,处在诸侯割据的状态,历史上称为“战国时期”。在魏国作官的孙膑,因为受到同僚庞涓的迫害,被齐国使臣救出后,到达齐国国都。 赛马是当时最受...

【题解】寻找祖先

【题解】寻找祖先

【题目描述】给出充足的父子关系,请你编写程序找到某个人的最早的祖先。规定每个人的名字都没有空格,且没有任意两个人的名字相同。最多可能有1000组父子关系,总人数最多可能达到50000人,家谱中的记载不...

【题解】求车速问题

【题目描述】一辆以固定速度行驶的汽车,司机在上午10点看到里程表上的读数是一个对称数(即这个数从左向右读和从右向左读是完全一样的),为95859。两小时后里程表上出现了一个新的对称数。问该车的速度是多...