基础实验6-2.2 汉密尔顿回路 (25分) --浙大版《数据结构学习与实验指导(第2版)》

121 篇文章 0 订阅
1 篇文章 0 订阅

题目连接:基础实验6-2.2 汉密尔顿回路 (25分)

著名的“汉密尔顿(Hamilton)回路问题”是要找一个能遍历图中所有顶点的简单回路(即每个顶点只访问 1 次)。本题就要求你判断任一给定的回路是否汉密尔顿回路。

输入格式:

首先第一行给出两个正整数:无向图中顶点数 N(2<N≤200)和边数 M。随后 M 行,每行给出一条边的两个端点,格式为“顶点1 顶点2”,其中顶点从 1 到N 编号。再下一行给出一个正整数 K,是待检验的回路的条数。随后 K 行,每行给出一条待检回路,格式为:

n V​1​​ V​2​​ ⋯ V​n​​

其中 n 是回路中的顶点数,V​i​​ 是路径上的顶点编号。

输出格式:

对每条待检回路,如果是汉密尔顿回路,就在一行中输出"YES",否则输出"NO"。

输入样例:

6 10
6 2
3 4
1 5
2 5
3 1
4 1
1 6
6 3
1 2
4 5
6
7 5 1 4 3 6 2 5
6 5 1 4 3 6 2
9 6 2 1 6 3 4 5 2 6
4 1 2 5 1
7 6 1 3 4 5 2 6
7 6 1 2 5 4 3 1

输出样例:

YES
NO
NO
NO
YES
NO

 

题解:

直接暴力···

#include <iostream>
#include <cstring>

using namespace std;

const int N = 220;

int n, m, q;
bool g[N][N];
int st[N];
int arr[N];

int main() {

	cin >> n >> m;
	for (int i = 0; i < m; i++)
	{
		int a, b;
		cin >> a >> b;
		g[a][b] = g[b][a] = true;
	}

	cin >> q;
	while (q--)
	{
		int k;
		cin >> k;
		memset(st, false, sizeof(st));
		for (int i = 0; i < k; i++)
			cin >> arr[i];

		bool flag = true;
		if (k != n + 1) flag = false;
		else
		{
			if (arr[0] != arr[k - 1]) flag = false;
			else
			{
				for (int i = 0; i < k - 1; i++)
				{
					if (!g[arr[i]][arr[i + 1]]) {
						flag = false;
						break;
					}
					else
					{
						st[arr[i + 1]]++;
					}
				}
			}
		}

		int cnt = 0;
		for (int i = 1; i < k; i++) {
			cnt += st[i];
			if (st[i] == 0) flag = false;
		}

		if (cnt != n) flag = false;

		if (flag) puts("YES");
		else puts("NO");

	}

	return 0;
}

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值