题目
题解思路
根据题目意思,我们貌似就是要找到一个点,让多个起点对于这个点的最短路长度奇偶性完全相同。
很容易想到,这个点到了之后可以在终点反复横跳,这样不会改变奇偶性。
但是如何只有这个条件的话,这题还是很难做出来。
更暴力的转化
取一个点作为起点,跑bfs,让它确定到每个点具有的所有奇偶性即可。
这种bfs属实巧妙,之前没有接触过。
AC代码
#include <bits/stdc++.h>
//#include <unordered_map>
//priority_queue
#define PII pair<int,int>
#define ll long long
using namespace std;
const int INF = 0x3f3f3f3f;
const int N = 200100;
vector <int> head[N] ;
int n , m , k ;
int dis[N][3] ;
int a[N] ;
void bfs(int sx )
{
dis[sx][0] = 1 ;
queue <PII> q ;
q.push({sx,0}) ;
while ( !q.empty())
{
auto tmp = q.front() ;
q.pop() ;
for (int i = 0 ; i < head[tmp.first].size() ; i++ )
{
int sk = head[tmp.first][i] ;
int tp = tmp.second^1 ;//确定到下个点的奇偶性
if ( !dis[sk][tp] )
{
dis[sk][tp] = 1 ;
q.push({sk,tp});
}
}
}
int falg = 0 ;
for (int i = 1 ; i <= k ; i++ )
{
falg = falg & dis[a[i]][0] ;
}
if ( falg )
cout << "YES\n" ;
else
cout << "NO\n" ;
}
int main()
{
ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
cin >> n >> m >> k ;
for (int i = 1 ; i <= m ; i++ )
{
int t1 , t2 ;
cin >> t1 >> t2 ;
head[t1].push_back(t2) ;
head[t2].push_back(t1) ;
}
int sx = -1 ;
for (int i = 1 ; i <= k ; i++ )
{
int t1 ;
cin >> t1 ;
a[i] = t1 ;
sx = t1 ;
}
bfs(sx);
return 0 ;
}