Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <vector>
- #include <algorithm>
- #include <cstdio>
- #include <string>
- #include <queue>
- #include <stack>
- #include <unordered_map>
- #include <unordered_set>
- #include <sstream>
- #include <math.h>
- using namespace std;
- int n, m, s, t, flow = 0;
- vector<unordered_map<int, pair<int, int>>> g;
- vector<bool> mark;
- int dfs(int v, int d) {
- if (mark[v])
- return 0;
- mark[v] = true;
- if (v == t) {
- return d;
- }
- for (int u = n - 1; u >= 0; u--) {
- if (g[v][u].second > g[v][u].first) {
- int res = dfs(u, 1);
- if (res > 0) {
- g[v][u].first += 1;
- g[u][v].first -= 1;
- return 1;
- }
- }
- }
- return 0;
- }
- bool path(int v) {
- cout << v + 1 << ' ';
- if (v == t) {
- cout << endl;
- return true;
- }
- for (int u = 0; u < n; u++) {
- if (g[v][u].first > 0) {
- g[v][u].first -= 1;
- g[u][v].first += 1;
- if (path(u)) {
- return true;
- }
- }
- }
- return false;
- }
- int main() {
- cin >> n >> m;
- cin >> s >> t;
- s--;
- t--;
- g.resize(n);
- mark.resize(n);
- for (int i = 0; i < m; ++i) {
- int u, v, c = 1;
- cin >> u >> v;
- u--;
- v--;
- g[u][v].second += c;
- g[v][u].second = g[v][u].first = 0;
- }
- while (true) {
- fill(mark.begin(), mark.end(), false);
- int delta = dfs(s, INT_MAX);
- if (delta > 0) {
- flow += delta;
- } else {
- break;
- }
- if (flow == 2) {
- break;
- }
- }
- if (flow >= 2) {
- cout << "YES" << endl;
- path(s);
- path(s);
- } else {
- cout << "NO";
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement