3月1日天梯赛刷题记录

L2-016 愿天下有情人都是失散多年的兄妹 (25 分)

在这里插入图片描述
在这里插入图片描述

分析:

  BFS与set的应用。5代人 相当于BFS 5层
,利用set 的性质 重复元素自动变没, 如果祖先里面有重复元素,那么set在插入前后的大小 不会变化 由此判断是否可以通婚。

代码:
#include<bits/stdc++.h>
typedef long long ll;
using namespace std;
struct node
{
	int f,m,sex;//父母编号,性别 
};
node people[100000];//p;
int m,b,father,mother;
bool exist[100000];//是否存在在本人Id里 如果不存在就无法知道其父母的编号
int level[100000];//第几代 
int main()
{
	int n;
	char c; 
	cin>>n;
	memset(exist,false,sizeof(exist));
	for(int i=0;i<n;i++)
	{
		 scanf("%d %c %d %d",&b,&c,&father,&mother);//编号 性别 父亲 母亲
		if(c=='M')
		 	people[b].sex=1;//男 
		else
			people[b].sex=0;//女
		people[b].f=father;
		people[b].m=mother;
		exist[b]=true;//存在本人ID里面 不存在的话等下直接跳过(无法再判断其父母了) 
		people[father].sex=1;//这里是为了后面直接判断两个人是不是同性的时候需要用到
			//即使这两个人没有出现在本人ID里面也可以知道他们的性别 
		people[mother].sex=0;
	} 
	int k;
	cin>>k;
	for(int i=0;i<k;i++)
	{
		fill(level,level+100000,0);//初始化代数
		int a,b;
		cin>>a>>b;//需要判断的两个人编号
		if(people[a].sex==people[b].sex)
		{
			printf("Never Mind\n");//如果两个人性别一样那么就
			continue;//下一轮判断 
		}
		queue<int> q;
		q.push(a);
		q.push(b);//将两人扔进队列
		level[a]=1;
		level[b]=1;//是第一代
		set<int> s;//用于判断是否有重复元素 如果有 说明有一样的祖先不能通婚
		int flag=0;//标记是否为NO了
		while(!q.empty())//直到队列不为空
		{
			int top=q.front();
			q.pop();
			int size=s.size();
			s.insert(top);//放进集合
			if(size==s.size())//如果集合数量没有变化的话说明 不能通婚
			{
				printf("No\n");
				flag=1;//标记结束 
				break; 
			} 
			//如果可以继续判断下一个 
			if(exist[top]==false) continue;//如果他不在本id里面 他父母不知道 所以就不把父母弄进队列了
			if(level[top]<=4)//小于四代 就把父母放进去
			{
				int fa=people[top].f;//父亲
				int mo=people[top].m;//母亲 
				if(fa!=-1)
				{
					q.push(fa);
					level[fa]=level[top]+1;//下一代 
				}
				if(mo!=-1)
				{
					q.push(mo);
					level[mo]=level[top]+1;//下一代 
				 } 
			} 
		 
		}
		if(flag==0) printf("Yes\n"); 
	}
	return 0;
} 

### 回答1: 我可以给你一些代码,可以让你使用Markdown语言记录你的刷题记录:``` # 刷题记录## 今刷题- 题目 1: - 解答:- 题目 2: - 解答:## 昨刷题- 题目 1: - 解答:- 题目 2: - 解答: ``` ### 回答2: 生成一个markdown语言的代码刷题记录可以通过以下步骤完成: 1. 创建一个markdown文件,命名为"刷题记录.md",并打开编辑器。 2. 在文件中添加一个标题,例如"刷题记录"。 3. 在下方添加一个表格,表格包含以下列:期、题目名称、题目难度、代码链接、思路。 4. 为每一道题目添加一行记录,按照期倒序排列。每行填写相应的信息,包括期、题目名称、题目难度、代码链接和思路。 示例: | 期 | 题目名称 | 题目难度 | 代码链接 | 思路 | | -------- | ------------ | ---------- | ----------- | -------- | | 2021/1/1 | 两数之和 | 简单 | [代码链接]() | 思路描述 | | 2021/1/2 | 反转链表 | 中等 | [代码链接]() | 思路描述 | | 2021/1/3 | 接雨水 | 困难 | [代码链接]() | 思路描述 | | ... | ... | ... | ... | ... | 5. 在代码链接处添加相应题目的代码链接,可以使用GitHub或Gist等代码托管平台。 6. 在思路处添加题目解法的思路描述,可以简要概括解法的关键步骤或思想。 完成以上步骤后,保存并关闭markdown文件。这样就生成了一个简单的代码刷题记录,方便查看和整理自己的刷题历程,以及回顾解题思路。 ### 回答3: 生成一个markdown语言的代码刷题记录可以按照以下步骤进行: 1. 首先创建一个markdown文件,可以以`.md`为扩展名,比如`leetcode.md`。 2. 在markdown文件中使用标题,表示题目的名称和难度。比如: ``` # [题目名称](题目链接) - 难度 ``` 3. 接下来,按照以下格式记录每道题目的代码和解题思路: ``` ## 题目描述 题目的具体描述和要求。 ## 解题思路 解题的思路和步骤。 ## 代码实现 使用适当的代码块标记,插入代码。 ```python # Python代码示例 解法代码 ``` ```cpp // C++代码示例 解法代码 ``` ## 复杂度分析 对解法进行时间复杂度和空间复杂度的分析。 ## 总结 对题目和解法进行总结。 ``` 4. 按照上述格式记录完每道题目的代码和解题思路后,保存markdown文件。 5. 在记录新的刷题内容时,可以按照上述格式在文件后面追加新的题目记录。 总结起来,生成一个markdown语言的代码刷题记录,需要创建一个markdown文件,并按照一定的格式记录每道题目的代码和解题思路。这样可以方便地查看每道题目的代码和解法,并进行总结和复习。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值