PTA DS基础实验6-2.2 汉密尔顿回路 (图的基本操作)

基础实验6-2.2 汉密尔顿回路

分数 25

全屏浏览

切换布局

作者 陈越

单位 浙江大学

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

输入格式:

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

nv​ v1​ v2​ ⋯ vn​

其中 nv​ 是回路中的顶点数,vi​ 是路径上的顶点编号。

输出格式:

对每条待检回路,如果是汉密尔顿回路,就在一行中输出 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

代码长度限制

16 KB

时间限制

400 ms

内存限制

64 MB

栈限制

8192 KB

// 2024/11/27 OK
#include <bits/stdc++.h>

using namespace std;

int n, m, k, flag;
int g[205][205];

int main()
{
    cin >> n >> m;
    for (int i = 1; i <= m; i ++)
    {
        int a, b;
        cin >> a >> b;
        g[a][b] = g[b][a] = 1;
    }
    cin >> k;
    for (int i = 1; i <= k; i ++)
    {
        int nv, flag = 0;
        cin >> nv;
        vector<int> v;
        map<int, int> mp;
        for (int j = 1; j <= nv; j ++) {
            int tmp;
            cin >> tmp;
            v.push_back(tmp);
        }
        if (nv != n + 1 || v.front() != v.back()) {
            flag = 1;
        }
        for (int j = nv; j > 1; j --) {
            int b = v.back(); v.pop_back();
            int a = v.back(); 
            if (!g[a][b]) {
                flag = 1;
                break;
            }
            mp[b] ++;
        }
        for (auto& t: mp) {
            if (t.second != 1) {
                flag = 1;
                break;
            }
        }
        if (!flag) {
            cout << "YES" << endl;
        } else {
            cout << "NO" << endl;
        }
    }
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值