基础实验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;
}