1122 Hamiltonian Cycle

本文介绍了一种算法,用于判断给定的无向图及其多个查询路径是否构成汉密尔顿环。汉密尔顿环是一种特殊的环,它经过图中的每一个节点恰好一次,并且回到起点。

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

题意:包含图中所有结点的简单环称为汉密尔顿环。给出无向图,然后给出k个查询,问每个查询是否是汉密尔顿环。

思路:根据题目可知,我们需要判断一下几个条件:(1).首先保证给定的环相邻两结点是连通的;(2).若图结点个数为n,则环的结点个数必须是n+1;(3).环的起点和终点必须相同;(4).除了首尾结点外,其余结点有且仅有出现过一次。

注意点:因为会多次查询,因此记得在每次查询前进行初始化!(这个点经常出错!画时间找这种错误非常浪费!)

代码:

#include <cstdio>
#include <cstring>
const int maxn=205;
int graph[maxn][maxn]={0};
int path[maxn];//存放查询的路径
int cnt[maxn]={0};//存放路径结点出现的次数

int main()
{int n,m,u,v;
    scanf("%d%d",&n,&m);
    for(int i=0;i<m;i++){
        scanf("%d%d",&u,&v);
        graph[u][v]=graph[v][u]=1;
    }
    int query,k;
    scanf("%d",&query);
    while(query--){
        scanf("%d",&k);
        bool flag=true;
        memset(cnt,0,sizeof(cnt));//每次查询前记得初始化!!!!!
        for(int i=0;i<k;i++){
            scanf("%d",&path[i]);
            cnt[path[i]]++;//统计路径上的结点出现过的次数
        }
        //判断1
        if(k!=n+1 || path[0]!=path[k-1])  flag=false;
        else{
            //判断2,环是否连通
            int pre=path[0];
            for(int i=1;i<k;i++){
                if(graph[pre][path[i]]==0){
                    flag=false;
                    break;
                }
                pre=path[i];
            }
            if(flag){
                //判断3
                for(int i=1;i<k-1;i++){
                    if(cnt[path[i]]>1){
                        flag=false;
                        break;
                    }
                }
            }
        }
        if(flag) printf("YES\n");
        else printf("NO\n");
    }
    return 0;
}

 

转载于:https://www.cnblogs.com/kkmjy/p/9577343.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值