题解 | #F题#
满意的数字
https://ac.nowcoder.com/acm/contest/11220/A
看结果,所有点都能在一起,那么它们都能同时在图上任意一个位置集合。 给图黑白染色,如果k个点颜色相同显然YES,当图中存在奇环时,也是YES,因为每个点可以走一圈奇环,改变当前的颜色。
#include<iostream>
#include<stdio.h>
#include<string.h>
#include<cstring>
#include<string>
#include<algorithm>
#include<math.h>
#include<cmath>
#include<queue>
#include<stack>
#include<vector>
#include<map>
#include<deque>
#include <time.h>
#include<unordered_map>
#include <set>
using namespace std;
typedef long long ll;
#define IOS ios::sync_with_stdio(false),cin.tie(0)
#define _for(i,a,b) for(int i=(a) ;i<=(b) ;i++)
#define _rep(i,a,b) for(int i=(a) ;i>=(b) ;i--)
#define mst(v,s) memset(v,s,sizeof(v))
#define all(v) v.begin(),v.end()
#define AC return 0
#define pb(v) push_back(v)
#define INF 0x7f7f7f7f7f7f7f7f
#define inf 0x3f3f3f3f
#define int long long
#define pii pair<int ,int >
#define fi first
#define se second
#define endl "\n"
const int N=2e5+10;
const int mod=19650827;
int n,m,k;
int col[N];
int a[N];
vector<int > G[N];
int cir;
void dfs(int x ,int fa ,int co)
{
col[x] = co;
// cout<<" x "<<x<<" "<<co<<" "<<fa<<endl;
for(int y:G[x])
{
if( y==fa ) continue;
// cout<<" y "<<y<<endl;
if( col[y]!=-1 )
{
if( co==col[y] ) cir=1;
return;
}
dfs(y,x,co^1);
}
}
signed main()
{
#ifndef ONLINE_JUDGE
freopen("in.txt", "r", stdin);
#endif
IOS;
cin>>n>>m>>k;
_for(i,1,m)
{
int x,y;cin>>x>>y;
G[x].push_back(y);
G[y].push_back(x);
}
_for(i,1,n) col[i]=-1;
_for(i,1,k) cin>>a[i];
dfs(1,0,1);
if( cir )
{
cout<<"YES"<<endl;
}
else
{
int ok=1;
_for(i,1,k)
{
if( col[a[i]]!=col[a[1]] )
{
ok=0;
break;
}
}
// _for(i,1,k) cout<<a[i]<<" ";
// cout<<endl;
if( ok ) cout<<"YES"<<endl;
else cout<<"NO"<<endl;
}
AC;
}