欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

1122 Hamiltonian Cycle(25 分)

程序员文章站 2022-03-01 13:36:44
...

一开始以为是图的遍历,但后来才发现不用DFS,直接看这个路径是否合法就可以
因为是遍历所有节点,因此合法的环路径必须是n+1个节点且头尾相同,而且全部节点都要出现,最后检查这个路径是否连通

#include<bits/stdc++.h>
using namespace std;
const int maxn=500;
int G[maxn][maxn],n,m;
bool vis[maxn];
int main()
{
    scanf("%d%d",&n,&m);
    while(m--)
    {
        int v1,v2;
        scanf("%d%d",&v1,&v2);
        G[v1][v2]=G[v2][v1]=1;
    }
    int k;
    scanf("%d",&k);
    while(k--)
    {
        int a[maxn],cnt;
        scanf("%d",&cnt);
        bool f=true;
        memset(vis,false,sizeof(vis));
        for(int i=0;i<cnt;i++)scanf("%d",&a[i]),vis[a[i]]=true;
        for(int i=1;i<=n;i++)
        {
            if(!vis[i])
            {
                f=false;
                break;
            }
        }
        for(int i=1;i<cnt;i++)
        {
            int v=a[i-1],u=a[i];
            if(G[v][u]==0)
            {
                f=false;
                break;
            }
        }
        if(cnt!=n+1||a[0]!=a[cnt-1]||f==false)printf("NO\n");
        else printf("YES\n");
    }
    return 0;
}