Advertisement
tiom4eg

Untitled

Apr 14th, 2022
46
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.05 KB | None | 0 0
  1. function dfs(v: int, g: int[][], d: int[], p: int[]) {
  2. for (let i = 0; i < g[v].length(); i += 1) {
  3. let u = g[v][i];
  4. if (d[u] != -1) { continue; }
  5. d[u] = d[v] + 1;
  6. p[u] = v;
  7. dfs(u, g, d, p);
  8. }
  9. }
  10.  
  11. function solve(input: string) -> string {
  12. let z = input.split("\n");
  13. let n = int(z[0].split(" ")[0]);
  14. let m = int(z[0].split(" ")[1]);
  15. let k = int(z[0].split(" ")[2]);
  16. let g: int[][] = [];
  17. let d: int[] = [];
  18. let p: int[] = [];
  19. for (let i = 0; i < n; i += 1) {
  20. g.push([]);
  21. d.push(-1);
  22. p.push(-1);
  23. }
  24. for (let i = 0; i < m; i += 1) {
  25. let ps = z[i + 1].split(" ");
  26. let u = int(ps[0]) - 1;
  27. let v = int(ps[1]) - 1;
  28. g[u].push(v);
  29. g[v].push(u);
  30. }
  31. d[0] = 0;
  32. dfs(0, g, d, p);
  33. if (n > 100000) {
  34. return "DFS COMPLETION TIME CHECK";
  35. }
  36. for (let i = 0; i < n; i += 1) {
  37. if (d[i] + 1 >= (n + k - 1) / k) {
  38. let res = "PATH\n" + string(d[i] + 1) + "\n";
  39. let ans: int[] = [];
  40. while (true) {
  41. ans.push(i + 1);
  42. if (i == 0) { return res + [from el in ans select string(el)].join(" "); }
  43. i = p[i];
  44. }
  45. }
  46. }
  47. let cyc: int[][] = [];
  48. let len: int[] = [];
  49. for (let v = 0; v < n && k > 0; v += 1) {
  50. let leaf = true;
  51. for (let i = 0; i < g[v].length(); i += 1) { leaf = leaf && (d[g[v][i]] < d[v]); }
  52. if (!leaf) { continue; }
  53. let x = -1;
  54. let y = -1;
  55. for (let i = 0; i < g[v].length(); i += 1) {
  56. let u = g[v][i];
  57. if (d[u] + 1 == d[v]) { continue; }
  58. if (x == -1) { x = u; }
  59. else if (y == -1) { y = u; }
  60. else { break; }
  61. }
  62. if (d[y] < d[x]) {
  63. let t = x;
  64. x = y;
  65. y = t;
  66. }
  67. if ((d[v] - d[x] + 1) % 3 != 0) {
  68. len.push(d[v] - d[x] + 1);
  69. let cur: int[] = [];
  70. let u = v;
  71. while (true) {
  72. cur.push(u + 1);
  73. if (u == x) { break; }
  74. u = p[u];
  75. }
  76. cyc.push(cur);
  77. }
  78. else if ((d[v] - d[y] + 1) % 3 != 0) {
  79. len.push(d[v] - d[y] + 1);
  80. let cur: int[] = [];
  81. let u = v;
  82. while (true) {
  83. cur.push(u + 1);
  84. if (u == y) { break; }
  85. u = p[u];
  86. }
  87. cyc.push(cur);
  88. }
  89. else {
  90. len.push(d[y] - d[x] + 2);
  91. let cur: int[] = [];
  92. let u = y;
  93. while (true) {
  94. cur.push(u + 1);
  95. if (u == x) { break; }
  96. u = p[u];
  97. }
  98. cur.push(v + 1);
  99. cyc.push(cur);
  100. }
  101. k -= 1;
  102. }
  103. let ans = "CYCLES\n";
  104. for (let i = 0; i < cyc.length(); i += 1) {
  105. ans += string(len[i]) + "\n" + [from el in cyc[i] select string(el)].join(" ") + "\n";
  106. }
  107. return ans;
  108. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement