自己在图论不是一道难题;ios
须要注意这个环判断的几个隐藏点:
1.首位相同;
2.每一个节点只能访问一次;spa
这里借鉴一位大神的操做,其实两种状况能够分两种判别方式,分开判别;
这里再次说一下set查重贼好用,这里能够看是否出现重复节点;code
#include<iostream> #include<stdlib.h> #include<stdio.h> #include<vector> #include<set> using namespace std; using std::vector; using std::set; const int maxn=210; int main(){ int n,m,cnt,k,a[maxn][maxn]={0}; cin>>n>>m; for(int i=0;i<m;i++){ int t1,t2; scanf("%d%d",&t1,&t2); a[t1][t2]=a[t2][t1]=1; } cin>>cnt; while(cnt--){ cin>>k; vector<int> v(k); set<int> s; int f1=1; int f2=1; for(int i=0;i<k;i++){ scanf("%d",&v[i]); s.insert(v[i]); } if(s.size()!=n||k-1!=n||v[0]!=v[k-1]) f1=0; for(int i=0;i<k-1;i++) if(a[v[i]][v[i+1]]==0) f2=false; printf("%s",f1&&f2?"YES\n":"NO\n"); } system("pause"); return 0; }