【PAT甲级】1122 Hamiltonian Cycle (25分)

题意:

输入一个正整数N(2<N<=200),表示结点个数,接着输入一个正整数M。输入M条有向边,输入一个正整数K,接着输入K次询问,每次询问包含一个圆环点总数,以及若干点。输出是否这些点构成一个环并且所有点都在环内。

trick:

数组开200或者300都会在最后一个测试点段错误。

AAAAAccepted code:

 1 #define HAVE_STRUCT_TIMESPEC
 2 #include<bits/stdc++.h>
 3 using namespace std;
 4 set<int>v[407];
 5 int a[407];
 6 int vis[407];
 7 int main(){
 8     ios::sync_with_stdio(false);
 9     cin.tie(NULL);
10     cout.tie(NULL);
11     int n,m;
12     cin>>n>>m;
13     for(int i=1;i<=m;++i){
14         int x,y;
15         cin>>x>>y;
16         v[x].insert(y);
17         v[y].insert(x);
18     }
19     int k;
20     cin>>k;
21     for(int i=1;i<=k;++i){
22         memset(vis,0,sizeof vis);
23         int x;
24         cin>>x;
25         for(int j=1;j<=x;++j)
26             cin>>a[j];
27         int flag=0;
28         if(a[x]!=a[1])
29             flag=1;
30         if(x!=1+n)
31             flag=1;
32         for(int j=2;j<=x;++j){
33             if(!v[a[j-1]].count(a[j]))
34                 flag=1;
35             if(vis[a[j-1]]&&j<x)
36                 flag=1;
37             vis[a[j-1]]=1;
38         }
39         if(flag)
40             cout<<"NO";
41         else
42             cout<<"YES";
43         if(i<k)
44             cout<<"\n";
45     }
46     return 0;
47 }

 

posted @ 2020-03-03 08:36  sewage  阅读(376)  评论(0编辑  收藏  举报