結果
問題 | No.2914 正閉路検出 |
ユーザー | Tatsu_mr |
提出日時 | 2024-10-05 01:33:39 |
言語 | C++23 (gcc 12.3.0 + boost 1.83.0) |
結果 |
WA
|
実行時間 | - |
コード長 | 3,325 bytes |
コンパイル時間 | 3,156 ms |
コンパイル使用メモリ | 262,356 KB |
実行使用メモリ | 813,732 KB |
最終ジャッジ日時 | 2024-10-05 01:33:47 |
合計ジャッジ時間 | 6,956 ms |
ジャッジサーバーID (参考情報) |
judge3 / judge5 |
(要ログイン)
テストケース
テストケース表示入力 | 結果 | 実行時間 実行使用メモリ |
---|---|---|
testcase_00 | AC | 1 ms
6,816 KB |
testcase_01 | AC | 2 ms
6,816 KB |
testcase_02 | AC | 2 ms
6,820 KB |
testcase_03 | AC | 2 ms
6,816 KB |
testcase_04 | AC | 2 ms
6,816 KB |
testcase_05 | AC | 1 ms
6,820 KB |
testcase_06 | AC | 2 ms
6,820 KB |
testcase_07 | AC | 2 ms
6,816 KB |
testcase_08 | AC | 1 ms
6,816 KB |
testcase_09 | AC | 2 ms
6,816 KB |
testcase_10 | AC | 2 ms
6,816 KB |
testcase_11 | AC | 2 ms
6,820 KB |
testcase_12 | AC | 2 ms
6,820 KB |
testcase_13 | WA | - |
testcase_14 | AC | 2 ms
6,820 KB |
testcase_15 | AC | 2 ms
6,820 KB |
testcase_16 | MLE | - |
testcase_17 | -- | - |
testcase_18 | -- | - |
testcase_19 | -- | - |
testcase_20 | -- | - |
testcase_21 | -- | - |
testcase_22 | -- | - |
testcase_23 | -- | - |
testcase_24 | -- | - |
testcase_25 | -- | - |
testcase_26 | -- | - |
testcase_27 | -- | - |
testcase_28 | -- | - |
testcase_29 | -- | - |
testcase_30 | -- | - |
testcase_31 | -- | - |
testcase_32 | -- | - |
testcase_33 | -- | - |
testcase_34 | -- | - |
testcase_35 | -- | - |
testcase_36 | -- | - |
testcase_37 | -- | - |
testcase_38 | -- | - |
testcase_39 | -- | - |
testcase_40 | -- | - |
testcase_41 | -- | - |
testcase_42 | -- | - |
testcase_43 | -- | - |
testcase_44 | -- | - |
testcase_45 | -- | - |
testcase_46 | -- | - |
testcase_47 | -- | - |
testcase_48 | -- | - |
testcase_49 | -- | - |
testcase_50 | -- | - |
testcase_51 | -- | - |
testcase_52 | -- | - |
testcase_53 | -- | - |
testcase_54 | -- | - |
ソースコード
#include <bits/stdc++.h> #define rep(i, n) for(long long i = 0; i < n; i++) #define ALL(v) (v).begin(), (v).end() using namespace std; using lint = long long; template <class T = long long> struct WeightedUnionFind { private: int n; vector<int> par, par2, dep; vector<T> diff_weight; public: WeightedUnionFind() {} WeightedUnionFind(int n_) : n(n_), par(n, -1), par2(n, -1), dep(n, 0), diff_weight(n, T(0)) {} int leader(int x) { assert(0 <= x && x < n); if (par[x] < 0) { return x; } else { int r = leader(par[x]); diff_weight[x] += diff_weight[par[x]]; return par[x] = r; } } T weight(int x) { assert(0 <= x && x < n); leader(x); return diff_weight[x]; } T diff(int x, int y) { assert(0 <= x && x < n); assert(0 <= y && y < n); return weight(y) - weight(x); } int merge(int a, int b, T w) { assert(0 <= a && a < n); assert(0 <= b && b < n); w += weight(a); w -= weight(b); int x = leader(a); int y = leader(b); if (x == y) { return x; } if (-par[x] < -par[y]) { swap(x, y); w *= T(-1); } par[x] += par[y]; par[y] = x; diff_weight[y] = w; par2[b] = a; dep[b] = dep[a] + 1; return x; } bool same(int x, int y) { assert(0 <= x && x < n); assert(0 <= y && y < n); return leader(x) == leader(y); } int size(int x) { assert(0 <= x && x < n); return -par[leader(x)]; } vector<int> route(int a, int b) { assert(0 <= a && a < n); assert(0 <= b && b < n); int x = (dep[a] < dep[b] ? a : b); int y = (dep[a] > dep[b] ? a : b); vector<int> res; int cur = y; while (cur != x) { res.emplace_back(cur); cur = par2[cur]; } res.emplace_back(x); if (res[0] != a) { reverse(res.begin(), res.end()); } return res; } vector<vector<int>> groups() { vector<vector<int>> member(n); for (int i = 0; i < n; i++) { member[leader(i)].emplace_back(i); } vector<vector<int>> res; for (int i = 0; i < n; i++) { if (member[i].size() > 0) { res.emplace_back(member[i]); } } return res; } }; int main() { int n, m; cin >> n >> m; WeightedUnionFind uf(n); map<pair<int, int>, int> es; rep(i, m) { int u, v; lint w; cin >> u >> v >> w; u--; v--; if (!uf.same(u, v)) { uf.merge(v, u, w); } else if (uf.diff(v, u) != w) { auto r = (uf.diff(v, u) > w ? uf.route(u, v) : uf.route(v, u)); int sz = r.size(); cout << sz << endl; cout << (uf.diff(v, u) > w ? u + 1 : v + 1) << endl; rep(j, sz - 1) { cout << es[{r[j], r[j + 1]}] + 1 << " "; } cout << i + 1 << endl; return 0; } es[{u, v}] = es[{v, u}] = i; } cout << -1 << endl; }