1122 Hamiltonian Cycle(25 分)

一开始以为是图的遍历,但后来才发现不用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;
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容