汉密尔顿回路问题

基础实验6-2.2 汉密尔顿回路 (25分)

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

代码

#include<iostream>
#include<cstdlib>
using namespace std;
#define MaxNum 210
typedef int Vertex;
typedef struct GNode *PtrNode;
struct GNode{ //定义图
    int Nv;
    int G[MaxNum][MaxNum];
    int visited[MaxNum]; //点的访问情况
};
typedef PtrNode MGraph; //图指针
MGraph Create(int VertexNum)
{
    Vertex i,j;
    auto Graph=(MGraph)malloc(sizeof(struct GNode));
    Graph->Nv=VertexNum;
    for (i=1;i<=VertexNum;i++){
        Graph->visited[i]=0;
        for (j=1;j<=VertexNum;++j)
            Graph->G[i][j]=0;
    }
    return Graph;
}
MGraph Build(MGraph Mg)
{
    int m;
    cin>>m;
    Vertex i,j;
    while(m--){
        cin>>i>>j;
        Mg->G[i][j]=1;
        Mg->G[j][i]=1;
    }
    return Mg;
}
void Refresh(MGraph M)
{
    for (int i=1;i<=M->Nv;i++)
        M->visited[i]=0;
}
void Judge(MGraph Mg){
    int k;
    int nNum;
    cin>>k;
    int i;
    while (k--){
        int flag=1;
        cin>>nNum;
        int a[nNum+1];
        for (i=1;i<=nNum;++i)
            cin>>a[i];
        if(a[1]!=a[nNum]){
            cout<<"NO\n";
            flag=0;
        }
        else
        {
            for (i = 1 ;i <nNum ; ++i) {
                if (Mg->G[a[i]][a[i+1]]==1){
                    Mg->visited[a[i]]++;
                }
                else{ //不连通则一定不是回路
                    cout<<"NO\n";
                    flag=0;
                    break;
                }
            }
        }
        if (flag)
            for(i=1;i<=Mg->Nv;++i){
                if(Mg->visited[i]!=1){
                    cout<<"NO\n";
                    flag=0;
                    break;
                }
            }
        if(flag)
            cout<<"YES\n";
        Refresh(Mg); //刷新访问情况
    }
}
int main()
{
    int n;
    cin>>n;
    MGraph Graph=Create(n);
    Graph=Build(Graph);
    Judge(Graph);
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值