Advertisement
tiom4eg

Crowd

Apr 14th, 2022
59
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.00 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.     for (let i = 0; i < n; i += 1) {
  34.         if (d[i] + 1 >= (n + k - 1) / k) {
  35.             let res = "PATH\n" + string(d[i] + 1) + "\n";
  36.             let ans: int[] = [];
  37.             while (true) {
  38.                 ans.push(i + 1);
  39.                 if (i == 0) { return res + [from el in ans select string(el)].join(" "); }
  40.                 i = p[i];
  41.             }
  42.         }
  43.     }
  44.     let cyc: int[][] = [];
  45.     let len: int[] = [];
  46.     for (let v = 0; v < n && k > 0; v += 1) {
  47.         let leaf = true;
  48.         for (let i = 0; i < g[v].length(); i += 1) { leaf = leaf && (d[g[v][i]] < d[v]); }
  49.         if (!leaf) { continue; }
  50.         cyc.push([]);
  51.         let x = -1;
  52.         let y = -1;
  53.         for (let i = 0; i < g[v].length(); i += 1) {
  54.             let u = g[v][i];
  55.             if (d[u] + 1 == d[v]) { continue; }
  56.             if (x == -1) { x = u; }
  57.             else if (y == -1) { y = u; }
  58.             else { break; }
  59.         }
  60.         if (d[y] < d[x]) {
  61.             let t = x;
  62.             x = y;
  63.             y = t;
  64.         }
  65.         if ((d[v] - d[x] + 1) % 3 != 0) {
  66.             len.push(d[v] - d[x] + 1);
  67.             let cur: int[] = [];
  68.             let u = v;
  69.             while (true) {
  70.                 cur.push(u + 1);
  71.                 if (u == x) { break; }
  72.                 u = p[v];
  73.             }
  74.             cyc.push(cur);
  75.         }
  76.         else if ((d[v] - d[y] + 1) % 3 != 0) {
  77.             len.push(d[v] - d[y] + 1);
  78.             let cur: int[] = [];
  79.             let u = v;
  80.             while (true) {
  81.                 cur.push(u + 1);
  82.                 if (u == y) { break; }
  83.                 u = p[v];
  84.             }
  85.             cyc.push(cur);
  86.         }
  87.         else {
  88.             len.push(d[y] - d[x] + 2);
  89.             let cur: int[] = [];
  90.             let u = y;
  91.             while (true) {
  92.                 cur.push(u + 1);
  93.                 if (u == x) { break; }
  94.                 u = p[v];
  95.             }
  96.             cur.push(v + 1);
  97.             cyc.push(cur);
  98.         }
  99.         k -= 1;
  100.     }
  101.     let ans = "CYCLES\n";
  102.     for (let i = 0; i < cyc.length(); i += 1) {
  103.         ans += string(len[i]) + "\n" + [from el in cyc[i] select string(el)].join(" ") + "\n";
  104.     }
  105.     return ans;
  106. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement