#include<bits/stdc++.h>
using namespace std;
const int MAXN=210;
int G[MAXN][MAXN];
int vis[MAXN]={};
vector<int> ppp;
int n,m;
bool judge(vector<int> a){
if(a.size()!=n+1||a[0]!=a[a.size()-1]) return false;
for(int i=0;i<a.size()-1;i++){
if(G[a[i]][a[i+1]]!=1) return false;
vis[a[i]]++;
if(vis[a[i]]>1) return false;
}
return true;
}
int main()
{
freopen("in.txt","r",stdin);
cin>>n>>m;
fill(G[0],G[0]+MAXN*MAXN,0);
for(int i=0;i<m;i++){
int start,end;cin>>start>>end;
G[start][end]=G[end][start]=1;
}
int k;cin>>k;
for(int i=0;i<k;i++){
fill(vis,vis+MAXN,0);
int t;cin>>t;ppp.resize(t);
for(int j=0;j<t;j++){
cin>>ppp[j];
}
if(judge(ppp)==false) cout<<"NO"<<endl;
else cout<<"YES"<<endl;
ppp.clear();
}
return 0;
}
上面时AC代码
下面是以前写的代码,很多漏洞。。。
#include<iostream>
#include<vector>
using namespace std;
vector<int> ed[201];
bool _find(vector<int> ed,int a){
if(ed.size()==0) return false;
for(int i=0;i<ed.size();i++){
if(ed[i]==a) return true;
}
return false;
}
int main()
{
#ifdef ONLINE_JUDGE
#else
freopen("in.txt","r",stdin);
#endif
int n,m;
cin>>n>>m;
for(int i=0;i<m;i++){
int start,end;
cin>>start>>end;
ed[start].push_back(end);
ed[end].push_back(start);
}
int t;
cin>>t;
for(int p=0;p<t;p++){
int k;
cin>>k;
vector<int> ppp;
for(int i=0;i<k;i++){
int temp;
cin>>temp;
ppp.push_back(temp);
}
int first=ppp[0];
int cnt[201]={};
for(int i=0;i<ppp.size()-1;i++){
if(_find(ed[ppp[i]],ppp[i+1])&&ppp[i+1]!=first){
cnt[ppp[i]]++;
continue;
}
if(ppp[i+1]==first){
cnt[ppp[i]]++;
cnt[ppp[i+1]]++;
break;
}
}
int sign=1;
int q;
for(q=1;q<first;q++){
if(cnt[q]!=1){
sign=0;break;
}
}
for(int tt=first+1;tt<=n;tt++){
if(cnt[tt]!=1){
sign=0;break;
}
}
if(sign==1&&cnt[first]==2){
cout<<"YES"<<endl;
}else{
cout<<"NO"<<endl;
}
}
return 0;
}
上面是自己的代码,两个测试点未过得到19分;
参考exmy的文章可以理清思路,考察图论这一部分中的哈密顿回路的必要条件:
- 序列首尾相同
- 序列长度 = 顶点个数 + 1
- 除首尾外,不会再有相同的顶点。
- 序列中相邻的两个顶点要求有边相连。