自己在圖論不是一道難題;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; }