Advertisement
Guest User

Untitled

a guest
Jan 20th, 2019
71
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.32 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2.  
  3. #define int long long
  4.  
  5. #define pii pair<int, int>
  6.  
  7. #define x1 x1228
  8. #define y1 y1228
  9.  
  10. #define left left228
  11. #define right right228
  12.  
  13. #define pb push_back
  14. #define eb emplace_back
  15.  
  16. #define mp make_pair
  17.  
  18. #define ff first
  19. #define ss second
  20.  
  21. #define matr vector<vector<int> >
  22.  
  23. #define all(x) x.begin(), x.end()
  24.  
  25.  
  26. using namespace std;
  27. typedef long long ll;
  28. typedef long double ld;
  29.  
  30. const int maxn = 3e5 + 7, mod = 1e9 + 7, inf = 1e18, MAXN = 1e6 + 7;
  31. const double eps = 1e-9;
  32. mt19937 rnd(time(0));
  33. struct edge {
  34. int a, b, f, c, id;
  35. };
  36.  
  37. vector<edge> e;
  38. int pt[maxn];
  39. vector<int> gr[maxn];
  40. int d[maxn];
  41. int lim;
  42. int s, t, ptr;
  43.  
  44. inline void add_edg(int a, int b, int c, int i) {
  45. edge ed;
  46. ed.a = a; ed.b = b; ed.f = 0; ed.c = c, ed.id = i;
  47. gr[a].push_back(e.size());
  48. e.push_back(ed);
  49. ed.a = b; ed.b = a; ed.f = 0; ed.c = 0, ed.id = i;
  50. gr[b].push_back(e.size());
  51. e.push_back(ed);
  52. }
  53.  
  54. inline bool bfs() {
  55. queue<int> q;
  56. for (int i = 0; i < ptr; i++)
  57. d[i] = inf;
  58. d[s] = 0;
  59. q.push(s);
  60. while (!q.empty() && d[t] == inf) {
  61. int cur = q.front(); q.pop();
  62. for (size_t i = 0; i < (int)gr[cur].size(); i++) {
  63. int id = gr[cur][i];
  64. int to = e[id].b;
  65. if (d[to] == inf && e[id].c - e[id].f >= lim) {
  66. d[to] = d[cur] + 1;
  67. q.push(to);
  68. }
  69. }
  70. }
  71. while (!q.empty())
  72. q.pop();
  73. return d[t] != inf;
  74. }
  75.  
  76. inline int dfs(int v, int flow) {
  77. if (flow == 0)
  78. return false;
  79. if (v == t)
  80. return true;
  81. for (; pt[v] < gr[v].size(); pt[v]++) {
  82. int id = gr[v][pt[v]];
  83. int to = e[id].b;
  84. if (d[to] == d[v] + 1 && e[id].c - e[id].f >= flow) {
  85. int pushed = dfs(to, flow);
  86. if (pushed) {
  87. e[id].f += flow;
  88. e[id ^ 1].f -= flow;
  89. return true;
  90. }
  91. }
  92. }
  93. return false;
  94. }
  95.  
  96. int n, m, a, h;
  97.  
  98. int dinic() {
  99. ptr = 3 * n;
  100. int flow = 0;
  101. for (lim = (1 << 0); lim >= 1;) {
  102. if (flow == 2) {
  103. break;
  104. }
  105. if (!bfs()) {
  106. lim >>= 1;
  107. continue;
  108. }
  109. for (int i = 0; i < ptr; i++)
  110. pt[i] = 0;
  111. while (dfs(s, lim)) {
  112. flow = flow + lim;
  113. if (flow == 2) {
  114. break;
  115. }
  116. }
  117. }
  118. return flow;
  119. }
  120.  
  121. set<int> have;
  122.  
  123. void get(int u, vector<int> &ans) {
  124. vector<int> dist(n, inf);
  125. vector<pii> pr(n, {-1, -1});
  126. dist[s] = 0;
  127. deque<int> q = {s};
  128. while (q.size()) {
  129. int u = q.front();
  130. q.pop_front();
  131. for (auto v : gr[u]) {
  132. edge hui = e[v];
  133. if (hui.c != 0 && hui.f == 1 && have.count(hui.id) == 0 && dist[hui.b] == inf) {
  134. dist[hui.b] = dist[u] + 1;
  135. q.pb(hui.b);
  136. pr[hui.b] = {u, hui.id};
  137. }
  138. }
  139. }
  140. int lst = t;
  141. while (lst != -1) {
  142. ans.pb(lst);
  143. have.insert(pr[lst].ss);
  144. lst = pr[lst].ff;
  145. }
  146. reverse(all(ans));
  147. }
  148.  
  149. void solve() {
  150. cin >> n >> m >> s >> t;
  151. --s, --t;
  152. for (int i = 0; i < m; ++i) {
  153. int x, y; cin >> x >> y, --x, --y;
  154. add_edg(x, y, 1, i);
  155. }
  156. int flow = dinic();
  157. if (flow == 2) {
  158. cout << "YES\n";
  159. vector<int> ans;
  160. get(s, ans);
  161. for (auto v : ans) {
  162. cout << v + 1 << " ";
  163. }
  164. cout << '\n';
  165. ans.clear();
  166. get(s, ans);
  167. for (auto v : ans) {
  168. cout << v + 1 << " ";
  169. }
  170. cout << '\n';
  171. } else {
  172. cout << "NO\n";
  173. }
  174. }
  175.  
  176. signed main() {
  177. #ifdef LOCAL
  178. freopen("TASK.in", "r", stdin);
  179. freopen("TASK.out", "w", stdout);
  180. #else
  181. freopen("snails.in", "r", stdin);
  182. freopen("snails.out", "w", stdout);
  183. #endif // LOCAL
  184. ios_base::sync_with_stdio(false);
  185. cin.tie(0);
  186. cout.precision(20);
  187. cout << fixed;
  188. int t = 1;
  189. for (int i = 0; i < t; ++i)
  190. solve();
  191. return 0;
  192. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement