Advertisement
Guest User

Untitled

a guest
May 26th, 2019
93
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.77 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2.  
  3. using namespace std;
  4.  
  5. #define sz(x) ((int)x.size ())
  6.  
  7. const int N = 2000;
  8. const int inf = 1e9 + 7;
  9.  
  10. int used[N], in[N], w[N];
  11.  
  12. int timer = 1;
  13. vector<int> g[N];
  14. int was[N], s, t;
  15.  
  16. struct edge {
  17. int fr, to, f;
  18. };
  19.  
  20. vector<edge> e;
  21.  
  22. void make (int a, int b, int c) {
  23. g[a].push_back(sz(e));
  24. e.push_back({a, b, c});
  25. g[b].push_back(sz(e));
  26. e.push_back({b, a, 0});
  27. }
  28.  
  29. int go (int v, int flow = inf) {
  30. was[v] = timer;
  31. if (v == t) return flow;
  32. for (auto i : g[v])
  33. if (e[i].f && was[e[i].to] != timer) {
  34. int push = go (e[i].to, min (flow, e[i].f));
  35. if (push) {
  36. e[i].f -= push;
  37. e[i^1].f += push;
  38. return push;
  39. }
  40. }
  41. return 0;
  42. }
  43.  
  44. void dfs (int v, int c, vector<vector<int>>& gr, vector<int>& A, vector<int>& B) {
  45. used[v] = 1 + c;
  46. if (!c) A.push_back(v);
  47. else B.push_back(v);
  48. for (auto x : gr[v])
  49. if (used[x] == 0)
  50. dfs (x, c ^ 1, gr, A, B);
  51. }
  52.  
  53. vector<int> get (vector<int>& p, vector<int>& A, int pos, vector<vector<int>>& gr) {
  54. vector<int> ans(sz(A));
  55. for (int i = 0; i < sz(A); i++) {
  56. for (auto x : gr[A[i]])
  57. if (w[x] >= 0 && p[w[x]] == pos)
  58. ans[i] = 1;
  59. }
  60. return ans;
  61. }
  62.  
  63. bool go (int pos, vector<int>& p, vector<int>& ans, vector<vector<int>>& gr, int n, vector<int>& S, vector<int>& A, vector<int>& B) {
  64. if (pos == sz(p)) {
  65. int ok = 0;
  66. vector<int> T;
  67. int k = sz(p);
  68. for (int i = 0; i < k; i++) {
  69. in[S[i]] = (p[i] == 0);
  70. if (p[i] == 2) T.push_back(S[i]);
  71. }
  72. for (int i = 0; i < k; i++) {
  73. if (p[i] == 0)
  74. for (auto x : gr[S[i]])
  75. ok |= in[x];
  76. }
  77. for (int i = 0; i < k; i++) {
  78. in[S[i]] = (p[i] == 1);
  79. }
  80. for (int i = 0; i < k; i++) {
  81. if (p[i] == 1)
  82. for (auto x : gr[S[i]])
  83. ok |= in[x];
  84. }
  85. if (ok) return false;
  86. if (ok) return false;
  87. auto Al = get (p, A, 0, gr);
  88. auto Ar = get (p, A, 1, gr);
  89. auto Bl = get (p, B, 0, gr);
  90. auto Br = get (p, B, 1, gr);
  91. vector<int> AlBr, ArBl;
  92. for (int i = 0; i < sz(A); i++) {
  93. if (Al[i]) AlBr.push_back(A[i]);
  94. if (Ar[i]) ArBl.push_back(A[i]);
  95. }
  96. for (int i = 0; i < sz(B); i++) {
  97. if (Br[i]) AlBr.push_back(B[i]);
  98. if (Bl[i]) ArBl.push_back(B[i]);
  99. }
  100. e.clear();
  101. s = 2 * n;
  102. t = s + 1;
  103. for (int i = 0; i <= t; i++) g[i].clear();
  104. for (int i = 0; i < n; i++)
  105. if (used[i] != -1) {
  106. make (i, n + i, 1);
  107. for (auto x : gr[i])
  108. if (used[x] != -1)
  109. make (n + i, x, 1);
  110. }
  111. for (auto x : AlBr) make (s, x, 1);
  112. for (auto x : ArBl) make (x + n, t, 1);
  113. timer++;
  114. int flow = 0;
  115. int cur;
  116. while (cur = go(s)) {
  117. flow += cur;
  118. timer++;
  119. if (flow >= sz(S) - sz(T)) break;
  120. }
  121. if (flow < sz(S) - sz(T)) {
  122. for (int i = 0; i < sz(e); i += 2)
  123. if (e[i].fr == s && !e[i].f) ans.push_back(e[i].to);
  124. for (auto x : T) ans.push_back(x);
  125. return true;
  126. }
  127. return false;
  128. }
  129. for (int i = 0; i < 3; i++) {
  130. p[pos] = i;
  131. if (go (pos + 1, p, ans, gr, n, S, A, B)) return true;
  132. }
  133. return false;
  134. }
  135.  
  136. bool solve (int n, vector<vector<int>>& gr, vector<int>& s, vector<int>& ans) {
  137. memset (w, -1, sizeof(w[0]) * n);
  138. memset (used, 0, sizeof(used[0]) * n);
  139. memset (in, 0, sizeof(in[0]) * n);
  140. vector<int> A, B;
  141. int k = sz(s);
  142. vector<int> t(k);
  143. for (int i = 0; i < k; i++)
  144. used[s[i]] = -1, w[s[i]] = i;
  145. for (int i = 0; i < n; i++)
  146. if (used[i] == 0)
  147. dfs (i, 0, gr, A, B);
  148. if (go (0, t, ans, gr, n, s, A, B)) {
  149. return true;
  150. }
  151. return false;
  152. }
  153.  
  154. bool tunec (int n, vector<vector<int>>& g, int k, vector<int>& ans) {
  155. if (n - 1 <= k) {
  156. for (int i = 0; i < k; i++)
  157. ans.push_back(i);
  158. return true;
  159. }
  160. vector<int> s(k + 1);
  161. for (int i = 0; i <= k; i++) s[i] = i;
  162. vector<vector<int>> gr(n);
  163. for (int i = 0; i < k; i++)
  164. for (auto x : g[i])
  165. if (x < i) {
  166. gr[i].push_back(x);
  167. gr[x].push_back(i);
  168. }
  169. for (int i = k; i < n; i++) {
  170. for (auto x : g[i])
  171. if (x < i) {
  172. gr[i].push_back(x);
  173. gr[x].push_back(i);
  174. }
  175. if (sz(s) <= k) {
  176. if (i != n - 1) s.push_back(i + 1);
  177. continue;
  178. }
  179. vector<int> x;
  180. auto ok = solve (i + 1, gr, s, x);
  181. if (!ok) break;
  182. if (i != n - 1) x.push_back(i + 1);
  183. s = x;
  184. }
  185. if (sz(s) <= k) {
  186. ans = s;
  187. return true;
  188. }
  189. return false;
  190. }
  191.  
  192. int main() {
  193. int n, m, k;
  194. cin >> n >> m >> k;
  195. vector<vector<int>> gr(n);
  196. for (int i = 0; i < m; i++) {
  197. int x, y;
  198. cin >> x >> y;
  199. x--; y--;
  200. gr[x].push_back(y);
  201. gr[y].push_back(x);
  202. }
  203. vector<int> s(k), ans;
  204. for (int i = 0; i < k; i++) cin >> s[i], s[i]--;
  205. if (solve (n, gr, s, ans)) {
  206. for (auto x : ans) cout << x + 1 << " ";
  207. }
  208. else cout << "No solution";
  209. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement