1122 Hamiltonian Cycle

1122 Hamiltonian Cycle_第1张图片1122 Hamiltonian Cycle_第2张图片

题目大意:

给一个无向图,然后查询k个环,问是不是哈密尔顿环(一个环遍历图上所有点有始有终且不重复访问)。

解题思路:

用set判断是否有重复访问的节点(起点终点例外),记录起点和终点比较判断能否走出一个环,用vector记录上一个节点判断当前节点是否可以访问到(存不存在路径)。
代码如下:

#include
#include
#include
#include
#include
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;
}

你可能感兴趣的:(STL,PAT甲级)