题目链接:(https://codeforces.com/problemset/problem/1666/L)
题意:有向图内 给一个s点 找一个t点
可以通过走两条完全不同的路径从起点走到终点
宽搜
我们记录 两条不同路径的from和last (输出路径)
如果两个点相遇 他们的from不同 就证明是两条路径
我们就可以输出了
#include<bits/stdc++.h>
using namespace std;
const int N = 2e5+50;
vector<int>e[N];
int n,m,s,from[N],lst[N],vis[N];
int main(void){
ios::sync_with_stdio(false);cin.tie(0);
cin>>n>>m>>s;
for(int i=1;i<=m;i++){
int u,v;
cin>>u>>v;
e[u].push_back(v);
}
vis[s]=1;
queue<int>q;
q.push(s);
while(!q.empty()){
int u=q.front();
q.pop();
for(auto v:e[u]){
if(vis[v]){
if(v==s) continue;
if(from[u]!=from[v]){
cout<<"Possible\n";
vector<int>a,b;
a.push_back(v);
for(int x=u;x;x=lst[x]) a.push_back(x);
reverse(a.begin(),a.end());
for(int x=v;x;x=lst[x]) b.push_back(x);
reverse(b.begin(),b.end());
cout<<a.size()<<"\n";
for(auto it:a) cout<<it<<" ";
cout<<"\n"<<b.size()<<"\n";
for(auto it:b) cout<<it<<" ";
return 0;
}
}
else{
vis[v]=1;
q.push(v);
from[v]=u==s?v:from[u];
lst[v]=u;
}
}
}
cout<<"Impossible\n";
return 0;
}