- 题源:王国——求策 - GYM
- 题意:给定左右各为
n
n
n 个点的完全二分图
†
^{\dag}
†,其中不同属性的两点间存在唯一的敌对关系点对
(
u
,
v
)
(u,v)
(u,v) 。给定源点
s
s
s 与终点
t
t
t,询问图中是否存在一条不同时包含互为敌对关系的两点的路径,使
s
s
s 到达
t
t
t。
† \dag † 完全二分图:二分图是指两种属性的点位于两侧,且仅不同属性的点间存在边的图;完全二分图是指对于每个点,其均与另一属性的点有且仅存在一条边的特殊二分图。 - 关键词:思维(签到)
- 题解:不难发现,当 s s s 与 t t t 位于异侧时,仅需 s s s 不与 t t t 互为敌对关系即可到达;当 s s s 与 t t t 位于同侧时,对侧点仅有 2 2 2 个点分别互为敌对关系,因此当 n > 2 n>2 n>2 时即一定可达。需注意 s = t s=t s=t 的情形,此时一定可达。
- 代码:
#include<bits/stdc++.h>
using namespace std;
using ll=long long;
#define int ll
#define endl "\n"
void solve(){
int n,s,t;cin>>n>>s>>t;
vector<int>a(n<<1|1);
for(int i=1;i<=n;i++) cin>>a[i],a[a[i]]=i;//注意敌对关系为双向的
if(s==t){
cout<<"Yes"<<endl;
return;
}
if(s<=n&&t<=n||s>n&&t>n){//同侧
if(n>2) cout<<"Yes"<<endl;
else cout<<"No"<<endl;
}else{//异侧
if(a[s]!=t&&a[t]!=s) cout<<"Yes"<<endl;
else cout<<"No"<<endl;
}
}
signed main(){
ios::sync_with_stdio(0),cin.tie(0);
int t=1;cin>>t;
while(t--) solve();
return 0;
}