Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <cstdlib>
- #include <vector>
- #include <algorithm>
- #include <set>
- #include <cmath>
- using namespace std;
- struct edge {
- int b, c, f;
- };
- vector<edge> ed;
- vector<int> MASHA;
- vector<int> PETYA;
- vector<int> g[100010];
- vector<bool> color;
- int n, m, s, t;
- void add_edge(int a, int b) {
- edge e1 = {b, 1, 0};
- edge e2 = {a, 0, 0};
- g[a].push_back ((int) ed.size());
- ed.push_back (e1);
- g[b].push_back ((int) ed.size());
- ed.push_back (e2);
- }
- int dfs(int v) {
- color[v] = 1;
- for(auto u:g[v]){
- if(color[ed[u].b] == 0 && ed[u].f < ed[u].c && (dfs(ed[u].b) || ed[u].b == t)){
- ed[u].f += 1;
- ed[u ^ 1].f -= 1;
- return 1;
- }
- }
- return 0;
- }
- void print_M( int v ) {
- MASHA.push_back(v);
- for(auto u:g[v])
- if (ed[u].f > 0) {
- ed[u].f--;
- print_M(ed[u].b);
- break;
- }
- }
- void print_P( int v ) {
- PETYA.push_back(v);
- for(auto u:g[v])
- if (ed[u].f > 0) {
- ed[u].f--;
- print_P(ed[u].b);
- break;
- }
- }
- int main() {
- ios_base::sync_with_stdio(0);
- cin.tie(0);
- cout.tie(0);
- cin >> n >> m >> s >> t;
- s--;
- t--;
- int v1,v2;
- while (m--) {
- cin >> v1 >> v2;
- add_edge(v1-1, v2-1);
- }
- for (int i = 0; i < 2; i++){
- color.assign(n,0);
- if (!dfs(s)) {
- cout << "NO\n";
- return 0;
- }
- }
- cout << "YES\n";
- print_P(s);
- print_M(s);
- for(auto M:MASHA){
- cout << M + 1 << ' ';
- }
- cout << '\n';
- for(auto P:PETYA){
- cout << P + 1 << ' ';
- }
- cout << '\n';
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement