[题解]2025CCPC东北邀请赛 - 王国——求策

  • 题源:王国——求策 - GYM
  • 题意:给定左右各为 \(n\) 个点的完全二分图\(^{\dag}\),其中不同属性的两点间存在唯一的敌对关系点对 \((u,v)\) 。给定源点 \(s\) 与终点 \(t\),询问图中是否存在一条不同时包含互为敌对关系的两点的路径,使 \(s\) 到达 \(t\)
    \(\dag\) 完全二分图:二分图是指两种属性的点位于两侧,且仅不同属性的点间存在边的图;完全二分图是指对于每个点,其均与另一属性的点有且仅存在一条边的特殊二分图。
  • 关键词:思维(签到)
  • 题解:不难发现,当 \(s\)\(t\) 位于异侧时,仅需 \(s\) 不与 \(t\) 互为敌对关系即可到达;当 \(s\)\(t\) 位于同侧时,对侧点仅有 \(2\) 个点分别互为敌对关系,因此当 \(n>2\) 时即一定可达。需注意 \(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;
}
posted @ 2025-05-26 11:31  椰萝Yerosius  阅读(140)  评论(0)    收藏  举报