关于c++:PAT甲级1122-Hamiltonian-Cycle

题目粗心

给定一个无向图,判断查问的门路是否是一个哈密顿圈。

算法思路

判断一条门路是一个哈密顿圈的办法为

  • 1、除了首尾节点其余节点没有反复,不反复的节点数目等于N
  • 2、首节点只能反复一次,所有节点数目为N+1
  • 3、首尾节点得相等
  • 4、任意两点之间连通

在输出每一条门路的时候,首先判断输出节点与上一个输出节点是否连通,如果不是设置flag为false.而后统计节点数目cnt,并将节点增加进set汇合s中,只有s.size()!=n||cnt!=n+1||!flag||start!=End,就阐明该门路不是哈密顿圈,输入NO,否则输入YES。

提交后果

AC代码

#include<cstdio>
#include<unordered_set>
#include<set>
#include<vector>

using namespace std;

int G[205][205];

int main() {
    int n, m;
    scanf("%d %d", &n, &m);
    for (int i = 0; i < m; ++i) {
        int a, b;
        scanf("%d %d", &a, &b);
        G[a][b] = G[b][a] = 1;
    }
    int k;
    scanf("%d", &k);
    for (int i = 0; i < k; ++i) {
        int num;
        scanf("%d", &num);
        unordered_set<int> s;
        // 终点,节点个数,起点
        int start, cnt = 1, End = 0;
        bool flag = true;// 门路是否连通
        scanf("%d", &start);
        int pre = start;
        for (int j = 1; j < num; ++j) {
            int v;
            scanf("%d", &v);
            if (G[pre][v] == 0) {
                flag = false;
            }
            if (j == num - 1) {
                End = v;
            }
            pre = v;
            ++cnt;
            s.insert(v);
        }
        if (s.size() != n || cnt != n + 1 || !flag || start != End) {
            printf("NO\n");
        } else {
            printf("YES\n");
        }
    }
    return 0;
}

评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

这个站点使用 Akismet 来减少垃圾评论。了解你的评论数据如何被处理