题目大意:
给一个无向图,然后查询k个环,问是不是哈密尔顿环(一个环遍历图上所有点有始有终且不重复访问)。
解题思路:
用set判断是否有重复访问的节点(起点终点例外),记录起点和终点比较判断能否走出一个环,用vector记录上一个节点判断当前节点是否可以访问到(存不存在路径)。
代码如下:
#include<iostream>
#include<map>
#include<set>
#include<cstdio>
#include<vector>
using namespace std;
map<int,int> virtex;
set<int> s;
int gra[210][210];
vector<int> v;
int main()
{
int n,m;
scanf("%d %d",&n,&m);
for(int i=0;i<m;i++)
{
int a,b;
scanf("%d %d",&a,&b);
gra[a][b]=gra[b][a]=1;//路径
}
int k;
scanf("%d",&k);
while(k--)
{
int num,cur,data[1000]={0};
bool flag=true;
scanf("%d",&num);
for(int i=0;i<num;i++) scanf("%d",&data[i]);
for(int i=0;i<num;i++)
{
int tmp=data[i];
if(i==0)
{
cur=tmp;//记录起点
v.push_back(tmp);
s.insert(tmp);
}
else if(i==(num-1))
{
int len=v.size();
if(cur!=tmp||gra[tmp][v[i-1]]==0)flag=false;//终点和起点是否一致且到达终点的路径是否存在
}
else
{
int len=v.size();
if(gra[tmp][v[i-1]]==0||s.find(tmp)!=s.end())//路径不存在或者重复访问
{
flag=false;
break;
}
else
{
s.insert(tmp);
v.push_back(tmp);
}
}
}
if(flag)
{
if(s.size()!=n)flag=false;
}
if(flag)printf("YES\n");
else printf("NO\n");
v.clear();s.clear();
}
return 0;
}