PTA团体程序设计天梯赛篇(三)----图论+搜索专题

搜索

球队“食物链” (搜索+剪枝)

题目链接

解题思路:
对于PAT的题目首先要先理解好题目。这里说了起点是1终点是N的一个哈密顿回路,因此我们在建好图之后,进行搜索即可,对于剪枝,因为最后一个点必须与1相连,因此对于该搜索到该节点,如果剩余的节点没有一个连向1,那么就可以返回。建图就是如果iWj,那么i有一条指向j的边,如果为L,则j指向i。

注意点:
要四舍五入后不是0,则范围在:大于等于0.05(四舍五入0.1),或小于等于-0.05(四舍五入-0.1)。即绝对值要大于0.05

代码:

#include <iostream>
#include <algorithm>
#include <cstring>
using namespace  std;

const int N = 24;
int n ;
int g[N][N];
char str[N];
int p[N] ;
bool flag, st[N];
void dfs(int u, int t) {
   
   
	if (flag)
		return ;
	if (t == n + 1 && g[u][1]  ) {
   
   
		flag = 1;
		return ;
	}
	int  k ;
	for (k = 1; k <= n ; ++k)
		if (!st[k] && g[k][1])
			break;
	if (k == n + 1)
		return ;

	for (int i = 1 ; i <= n;  ++i) {
   
   
		if (!st[i] && g[u][i] && !flag ) {
   
   
			p[t] = i;
			st[i] = 1;
			dfs(i, t + 1);
			st[i] = 0;
		}
	}
}

int main() {
   
   
	cin >> n;
	for (int i = 1 ; i <= n ; ++i) {
   
   
		scanf("%s", str);
		for (int j = 1 ; j <= n ; ++j) {
   
   
			char ch = str[j - 1];
			if (ch == 'W')
				g[i][j] = 1;
			else if (ch == 'L')
				g[j][i] = 1;
		}
	}
	p[1] = 1, st[1] = 1;
	dfs(1, 2);
	if (flag)
		for (int i = 1 ; i <= n ; ++i)
			if (i != n)
				cout << p[i] << ' ';
			else
				cout << p[i] << endl;
	else
		cout << "No Solution\n";

	return 0;
}

愿天下有情人都是失散多年的兄妹(搜索+公共祖先)

题目链接

解题思路
我们将关系进行建树(用邻接表来存)后,只要在搜索的时候,出现当后面搜索的那个人,有一个存在的关系节点,被访问过了就说明它们两个之间在五代之内存在关系。

注意事项
需要将父母的性别也记录下来,不然有几个点过不去。

代码:

#include <iostream>
#include <algorithm>
#include <cstring>
#include <vector>
using namespace std;

const int N = 1e5 + 10;

vector<int>g[N];
int n, m;
char sex[N];
bool st[N], key;

void dfs(int u, int h) {
   
   
    st[u] = 1;
	if (h >= 4)
		return ;
	for (int i = 0 ; i < g[u].size() ; ++i) {
   
   
		int x = g[u][i];
		if (!st[x]) 
			dfs(x, h + 1);
		 else
			key = 1;
	}
}

int main() {
   
   
	cin >> n ;
	for (int i = 1; i <= n ; ++i) {
   
   
		int a, b, c;
		char x;
		cin >> a >> x >> b >> c;
		sex[a] =  x;
		if (b != -1)
			g[a].push_back(b) ,sex[b] = 'M';
		if (c != -1)
			g[a].push_back(c) ,sex[c] = 'F';
	}
	cin >> m;
	while (m--) {
   
   
		int a, b;
		cin >> a >> b;
		if (sex[a] == sex[b])
			cout << "Never Mind\n";
		else {
   
   
			key = false;
			memset(st, 0, sizeof st);
			dfs(a, 0);
			dfs(b, 0);
			if (key)
				cout << "No\n";
			else
				cout << "Yes\n";
		}
	}
	return 0;
}

功夫传人

题目链接

解题思路
这题就是依据关系建好图之后在图上跑一遍dfs。注意的是只是求得道者的功力总和。

代码:

#include <iostream>
#include <cstring>
#include <vector>
using namespace std;
typedef long long LL;
const int N = 1e5 + 10;
vector<int>g[N]; //邻接表存图
int n ;
double Z, r,  power[N] , ans;
bool st[N] ;

void dfs(int u, double val) {
   
   
	if (power[u]) {
   
   
		ans += val * power[u];
		st[u] = 1;
		return ;
	}
	st[u] = 1;

	for (int i = 0 ; i < (int)g
PTA团体程序设计天梯赛答案是指针对某一轮天梯赛所要求编写的程序代码的解答。每一轮天梯赛都会出一系列的题目,选手需要根据题目要求,使用某种编程语言编写程序来实现对应功能。这些程序就是答案。 PTA团体程序设计天梯赛是一个参与计算机程序设计的比赛,每个参赛者需要根据题目要求设计合适的算法,写出正确的程序答案。比赛的题目一般包括基本算法、数据结构、图论、动态规划等内容,涵盖了程序设计的各个方面。 对于每一轮的天梯赛,参赛者需要根据题目的要求,编写相应的程序答案。这些答案可能包括一个或多个代码文件,选手需要使用合适的编程语言编写代码,通过对输入数据的处理,输出满足题目要求的结果。 比如,某题目要求计算两个整数相加的结果,并输出。选手可以使用C++、Java、Python等编程语言编写不同的程序答案,通过编译或解释执行来得到正确的结果,并进行提交。 编写程序答案时,选手需要仔细研究题目的要求,分析问题的性质和难点,选择合适的算法和数据结构,设计出正确高效的程序。在编写过程中,还需要进行充分的测试,确保程序在各种情况下都能正确运行。 总之,PTA团体程序设计天梯赛答案是学生根据比赛要求编写的程序代码,通过解析题目要求,设计合理的算法和数据结构,实现问题解决的程序。在比赛中,选手可以根据给定的测试用例来验证自己的程序是否正确,并提交答案。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

落春只在无意间

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值