Advertisement
Guest User

Untitled

a guest
Sep 21st, 2019
118
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.06 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. #define int long long
  3. using namespace std;
  4. typedef long long ll;
  5. #define pii pair<int, int>
  6. #define fs first
  7. #define sc second
  8. #define pb push_back
  9. #define mp make_pair
  10.  
  11. const int N = 105;
  12. const int INF = 2e9 + 5;
  13.  
  14. struct edge {
  15. int u, v, p;
  16. edge *rev;
  17. edge(){}
  18. edge(int u, int v, int p, edge* rev = nullptr) {
  19. this->u = u;
  20. this->v = v;
  21. this->p = p;
  22. this->rev = rev;
  23. }
  24. };
  25.  
  26. vector<edge*> g[N];
  27.  
  28. edge* ed[N * N];
  29.  
  30. int dist[N], cnt[N], n, m;
  31. vector<bool> vis(N);
  32.  
  33. queue<int> q;
  34.  
  35. bool bfs(int v, int u) {
  36. fill(vis.begin(), vis.end(), false);
  37. q.push(v);
  38. vis[v] = true;
  39. dist[v] = 0;
  40. while(!q.empty()) {
  41. int v = q.front();
  42. q.pop();
  43. for (int i = 0; i < g[v].size(); i++) {
  44. int to = g[v][i]->v;
  45. if (vis[to] || g[v][i]->p == 0)
  46. continue;
  47. vis[to] = true;
  48. dist[to] = dist[v] + 1;
  49. q.push(to);
  50. }
  51. }
  52. return vis[u];
  53. }
  54.  
  55. bool dfs(int v, int fn, int flow) {
  56. if (v == fn)
  57. return true;
  58. for (int i = cnt[v]; i < g[v].size(); i++, cnt[v]++) {
  59. if (g[v][i]->p == 0 || dist[g[v][i]->v] != dist[v] + 1)
  60. continue;
  61. if (dfs(g[v][i]->v, fn, 1)) {
  62. g[v][i]->p = 0;
  63. g[v][i]->rev->p = 1;
  64. return true;
  65. }
  66. }
  67. return false;
  68. }
  69.  
  70. inline int getFlow(int u, int v) {
  71. int res = 0;
  72. while(bfs(u, v)) {
  73. for (int i = 0; i < n; i++)
  74. cnt[i] = 0;
  75. while(dfs(u, v, 1))
  76. res++;
  77. }
  78.  
  79. for (int i = 0; i < m; i++) {
  80. if (ed[i]->p == 0 && ed[i]->rev->p == 1) {
  81. ed[i]->p = 1;
  82. ed[i]->rev->p = 0;
  83. }
  84. }
  85. return res;
  86. }
  87.  
  88. signed main()
  89. {
  90. ios_base::sync_with_stdio(false);
  91. cin.tie(0);
  92. cout.tie(0);
  93.  
  94. int tests;
  95. cin >> tests;
  96. while(tests--) {
  97. cin >> n >> m;
  98. for (int i = 0; i < n; i++)
  99. g[i].clear();
  100. for (int i = 0; i < m; i++) {
  101. int u, v;
  102. cin >> u >> v;
  103. u--, v--;
  104. g[u].pb(new edge(u, v, 1));
  105. g[v].pb(new edge(v, u, 0, g[u].back()));
  106. g[u].back()->rev = g[v].back();
  107. ed[i] = g[u].back();
  108. }
  109. pii good_pair;
  110. int ans = INF;
  111.  
  112. for (int u = 0; u < n; u++) {
  113. for (int v = 0; v < n; v++) {
  114. if (u == v)
  115. continue;
  116. int res = getFlow(u, v);
  117. if (res < ans) {
  118. ans = res;
  119. good_pair = mp(u, v);
  120. }
  121. }
  122. }
  123. cout << ans << endl;
  124. int u = good_pair.fs, v = good_pair.sc;
  125.  
  126. for (int i = 0; i < m; i++) {
  127. ed[i]->p = 0;
  128. if (getFlow(u, v) == ans - 1) {
  129. ans--;
  130. cout << i + 1 << " ";
  131. }
  132. else
  133. ed[i]->p = 1;
  134. }
  135. cout << endl;
  136. }
  137. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement