Advertisement
Guest User

Untitled

a guest
May 25th, 2019
83
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.13 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 = 200;
  8. const int inf = 1e9 + 7;
  9.  
  10. int n, m, k;
  11. vector<int> gr[N], S, A, B;
  12. int used[N], in[N], w[N];
  13.  
  14. int timer = 1;
  15. vector<int> g[N];
  16. int was[N], s, t;
  17.  
  18. struct edge {
  19. int fr, to, f;
  20. };
  21.  
  22. vector<edge> e;
  23.  
  24. void make (int a, int b, int c) {
  25. g[a].push_back(sz(e));
  26. e.push_back({a, b, c});
  27. g[b].push_back(sz(e));
  28. e.push_back({b, a, 0});
  29. }
  30.  
  31. int go (int v, int flow = inf) {
  32. was[v] = timer;
  33. if (v == t) return flow;
  34. for (auto i : g[v])
  35. if (e[i].f && was[e[i].to] != timer) {
  36. int push = go (e[i].to, min (flow, e[i].f));
  37. if (push) {
  38. e[i].f -= push;
  39. e[i^1].f += push;
  40. return push;
  41. }
  42. }
  43. return 0;
  44. }
  45.  
  46. int get() {
  47. timer++;
  48. int flow = 0;
  49. int cur;
  50. while (cur = go(s)) {
  51. flow += cur;
  52. timer++;
  53. }
  54. return flow;
  55. }
  56.  
  57. void dfs (int v, int c) {
  58. used[v] = 1 + c;
  59. if (!c) A.push_back(v);
  60. else B.push_back(v);
  61. for (auto x : gr[v])
  62. if (used[x] == 0)
  63. dfs (x, c ^ 1);
  64. }
  65.  
  66. vector<int> get (vector<int>& p, vector<int>& A, int pos) {
  67. vector<int> ans(sz(A));
  68. for (int i = 0; i < sz(A); i++) {
  69. for (auto x : gr[A[i]])
  70. if (w[x] >= 0 && p[w[x]] == pos)
  71. ans[i] = 1;
  72. }
  73. return ans;
  74. }
  75.  
  76. bool go (int pos, vector<int>& p, vector<int>& ans) {
  77. if (pos == k) {
  78. int ok = 0;
  79. vector<int> T;
  80. for (int i = 0; i < k; i++) {
  81. in[S[i]] = (p[i] == 1);
  82. if (p[i] == 2) T.push_back(S[i]);
  83. }
  84. for (int i = 0; i < k; i++) {
  85. if (p[i] == 0)
  86. for (auto x : gr[S[i]])
  87. ok |= in[x];
  88. }
  89. if (ok) return false;
  90. auto Al = get (p, A, 0);
  91. auto Ar = get (p, A, 1);
  92. auto Bl = get (p, B, 0);
  93. auto Br = get (p, B, 1);
  94. vector<int> AlBr, ArBl;
  95. for (int i = 0; i < sz(A); i++) {
  96. if (Al[i]) AlBr.push_back(A[i]);
  97. if (Ar[i]) ArBl.push_back(A[i]);
  98. }
  99. for (int i = 0; i < sz(B); i++) {
  100. if (Br[i]) AlBr.push_back(B[i]);
  101. if (Bl[i]) ArBl.push_back(B[i]);
  102. }
  103. e.clear();
  104. s = 2 * n;
  105. t = s + 1;
  106. for (int i = 0; i <= t; i++) g[i].clear();
  107. for (int i = 0; i < n; i++)
  108. if (used[i] != -1) {
  109. make (i, n + i, 1);
  110. for (auto x : gr[i])
  111. if (used[x] != -1)
  112. make (n + i, x, 1);
  113. }
  114. for (auto x : AlBr) make (s, x, 1);
  115. for (auto x : ArBl) make (x + n, t, 1);
  116. if (get() < sz(S) - sz(T)) {
  117. for (int i = 0; i < sz(e); i += 2)
  118. if (e[i].fr == s && !e[i].f) ans.push_back(e[i].to);
  119. for (auto x : T) ans.push_back(x);
  120. return true;
  121. }
  122. return false;
  123. }
  124.  
  125. for (int i = 0; i < 3; i++) {
  126. p[pos] = i;
  127. if (go (pos + 1, p, ans)) return true;
  128. }
  129. return false;
  130. }
  131.  
  132. int main() {
  133. memset (w, -1, sizeof(w));
  134. cin >> n >> m >> k;
  135. S.resize(k);
  136. for (int i = 0; i < m; i++) {
  137. int x, y;
  138. cin >> x >> y;
  139. x--; y--;
  140. gr[x].push_back(y);
  141. gr[y].push_back(x);
  142. }
  143. vector<int> t(k);
  144. for (int i = 0; i < k; i++) cin >> S[i], 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);
  148. vector<int> ans;
  149. if (go (0, t, ans))
  150. for (auto x : ans) cout << x + 1 << " ";
  151. else cout << "No solution";
  152. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement