1122 Hamiltonian Cycle (25 分)

该程序实现检查给定的图是否包含哈密顿回路,即能否找到一条路径遍历所有节点且起点与终点相同。输入包括图的顶点数、边数、边的连接以及需要验证的特定路径。程序会根据路径是否连续、是否存在未被包含的节点以及路径长度是否正确来判断哈密顿回路的存在性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

哈密顿回路满足的条件

1.经过所有点

2..终点和起点相同

3.回路的点数等于图顶点数+1(也就是除去起点终点每个点都走一次)

#include <iostream>
#include <vector>
#include <unordered_map>
using namespace std;
int n,m,a,b,T;
int g[300][300];
int main()
{
	cin >> n >> m;
	for(int i = 0 ; i < m; i ++)
	{
		cin >> a >> b;
		g[a][b] = g[b][a] = 1;
	}
	cin >> T;
	while(T --)
	{
		int tt,f = 1,all = 1;
		cin >> tt;
		vector<int>v(tt);
		unordered_map<int,int>mp;
		for(int i = 0; i < tt; i ++) 
		{
			cin >> v[i];
			mp[v[i]] ++;
		}
		for(int i = 1; i < tt; i ++) if(g[v[i]][v[i - 1]] != 1) f = 0;
		for(int i = 1; i <= n; i ++) if(!mp.count(i)) all = 0;
		if(f == 0 || v[0] != v.back() || all == 0 || tt != n + 1) puts("NO");
		else puts("YES");	
	}
	return 0;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值