a53

StarDust

a53
Jul 30th, 2020 (edited)
164
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.85 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3.  
  4. typedef vector<int> vi;
  5. typedef vector<vi> vvi;
  6.  
  7. int n, m, x, y, s, viz[1001], nr[1001], d[1001];
  8. vector<pair<int, pair<int, int>>> edges;
  9. vector<int> arb[1001][101];
  10. vector<int> tree[201], subtreeLabels[201], children[201];
  11. vector<int> L[101], pred;
  12.  
  13. bool compare(int a, int b) {
  14. return subtreeLabels[a] < subtreeLabels[b];
  15. }
  16.  
  17. bool equals(int a, int b) {
  18. return subtreeLabels[a] == subtreeLabels[b];
  19. }
  20.  
  21. vi findCenter(int offset = 0) {
  22. int cnt = n;
  23. vi a;
  24. vi deg(n);
  25. for (int i = 0; i < n; i++) {
  26. deg[i] = tree[i + offset].size();
  27. if (deg[i] <= 1) {
  28. a.push_back(i + offset);
  29. --cnt;
  30. }
  31. }
  32.  
  33. while (cnt > 0) {
  34. vi na;
  35. for (int i = 0; i < (int) a.size(); i++) {
  36. int u = a[i];
  37. for (int j = 0; j < (int) tree[u].size(); j++) {
  38. int v = tree[u][j];
  39. if (--deg[v - offset] == 1) {
  40. na.push_back(v);
  41. --cnt;
  42. }
  43. }
  44. }
  45. a = na;
  46. }
  47. return a;
  48. }
  49.  
  50. int dfs(int u, int p = -1, int depth = 0) {
  51. L[depth].push_back(u);
  52. int h = 0;
  53. for (int i = 0; i < (int) tree[u].size(); i++) {
  54. int v = tree[u][i];
  55. if (v == p)
  56. continue;
  57. pred[v] = u;
  58. children[u].push_back(v);
  59. h = max(h, dfs(v, u, depth + 1));
  60. }
  61. return h + 1;
  62. }
  63.  
  64. bool rootedTreeIsomorphism(int r1, int r2) {
  65. for(int i = 0; i < n; i++) {
  66. L[i].clear();
  67. }
  68. for(int i = 0; i < 2 * n; i++) {
  69. pred.push_back(-1);
  70. }
  71. for(int i = 0; i < 2 * n; i++) {
  72. children[i].clear();
  73. }
  74. //children.assign(2 * n, vi());
  75.  
  76. int h1 = dfs(r1);
  77. int h2 = dfs(r2);
  78. if (h1 != h2)
  79. return false;
  80.  
  81. int h = h1 - 1;
  82. vi label(2 * n);
  83. for(int i = 0; i < 2 * n; i++) {
  84. subtreeLabels[i].clear();
  85. }
  86. //subtreeLabels.assign(2 * n, vi());
  87.  
  88. for (int i = h - 1; i >= 0; i--) {
  89. for (int j = 0; j < (int) L[i + 1].size(); j++) {
  90. int v = L[i + 1][j];
  91. subtreeLabels[pred[v]].push_back(label[v]);
  92. }
  93. for (int j = 0; j < (int) L[i].size(); j++) {
  94. int v = L[i][j];
  95. sort(subtreeLabels[v].begin(), subtreeLabels[v].end());
  96. }
  97.  
  98. sort(L[i].begin(), L[i].end(), compare);
  99.  
  100. for (int j = 0, cnt = 0; j < (int) L[i].size(); j++) {
  101. if (j && !equals(L[i][j], L[i][j - 1]))
  102. ++cnt;
  103. label[L[i][j]] = cnt;
  104. }
  105. }
  106.  
  107. if (!equals(r1, r2))
  108. return false;
  109. return true;
  110. }
  111.  
  112. bool treeIsomorphism() {
  113. vi c1 = findCenter();
  114. //c1.push_back(0);
  115. vi c2 = findCenter(n);
  116. if (c1.size() == c2.size()) {
  117. if (rootedTreeIsomorphism(c1[0], c2[0]))
  118. return true;
  119. else if (c1.size() > 1)
  120. return rootedTreeIsomorphism(c1[1], c2[0]);
  121. }
  122. return false;
  123. }
  124.  
  125. bool izo(int p, int q) {
  126. for(int i = 0; i < 2 * n; i++) {
  127. tree[i].clear();
  128. }
  129. //tree.assign(2 * n, vi());
  130. for (int u = 0; u < n; u++) {
  131. for (int i = 0; i < (int)arb[p][u].size(); i++) {
  132. int v = arb[p][u][i];
  133. tree[u].push_back(v);
  134. }
  135. for (int i = 0; i < (int)arb[q][u].size(); i++) {
  136. int v = arb[q][u][i];
  137. tree[u + n].push_back(v + n);
  138. }
  139. }
  140. return treeIsomorphism();
  141. }
  142.  
  143. int main()
  144. {
  145. ifstream f("stardust.in");
  146. ofstream g("stardust.out");
  147. f >> s >> m >> x >> y >> n;
  148. for(int i = 1; i <= m; i++) {
  149. int u, v, w;
  150. f >> u >> v >> w;
  151. edges.push_back(make_pair(w, make_pair(u, v)));
  152. }
  153. for(int j = 1; j <= s; j++) {
  154. d[j] = 1e9;
  155. for(int i = 1; i < n; i++) {
  156. int u, v;
  157. f >> u >> v;
  158. u--; v--;
  159. //cout << u << v << '\n';
  160. arb[j][u].push_back(v);
  161. arb[j][v].push_back(u);
  162. }
  163. //cout << '\n';
  164. }
  165. viz[x] = 1;
  166. for(int i = 1; i <= s; i++) {
  167. viz[i] = izo(x, i);
  168. //cout << viz[i] << '\n';
  169. }
  170. d[x] = 0;
  171. for(int i = 1; i < s; i++) {
  172. for(int j = 0; j < m; j++) {
  173. int n1 = edges[j].second.first;
  174. int n2 = edges[j].second.second;
  175. int c = edges[j].first;
  176. if(viz[n2] && d[n1] != 1e9 && d[n1] + c < d[n2]) {
  177. d[n2] = d[n1] + c;
  178. }
  179. }
  180. }
  181. for(int j = 0; j < m; j++) {
  182. int n1 = edges[j].second.first;
  183. int n2 = edges[j].second.second;
  184. int c = edges[j].first;
  185. if(viz[n2] && d[n1] != 1e9 && d[n1] + c < d[n2]) {
  186. g << "Black hole detected!";
  187. return 0;
  188. }
  189. }
  190. g << d[y];
  191. return 0;
  192. }
  193.  
Add Comment
Please, Sign In to add comment