結果
問題 | No.3079 Unite Japanese Prefectures |
ユーザー |
![]() |
提出日時 | 2025-03-19 07:17:24 |
言語 | C++23 (gcc 13.3.0 + boost 1.87.0) |
結果 |
WA
|
実行時間 | - |
コード長 | 1,747 bytes |
コンパイル時間 | 3,927 ms |
コンパイル使用メモリ | 300,276 KB |
実行使用メモリ | 61,184 KB |
最終ジャッジ日時 | 2025-03-19 07:17:39 |
合計ジャッジ時間 | 14,738 ms |
ジャッジサーバーID (参考情報) |
judge2 / judge3 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 2 WA * 1 |
other | AC * 11 WA * 1 TLE * 1 -- * 14 |
ソースコード
#include <bits/stdc++.h> using namespace std; #include <atcoder/dsu> #define rep(i, l, r) for (int i = (int)(l); i<(int)(r); i++) #define ll long long int main() { int N, M; cin >> N >> M; vector<tuple<int, int, int>> Edges(M); rep(i, 0, M) { int u, v, c; cin >> u >> v >> c; u--; v--; c--; Edges[i] = {c, u, v}; } array<int, 6> cnt = {0, 0, 0, 0, 0, 0}; atcoder::dsu d(N); sort(Edges.begin(), Edges.end()); for (int i = 0; i < M; i++) { auto[c, u, v] = Edges[i]; if (!d.same(u, v)) { d.merge(u, v); cnt[c]++; } } //累積 for (int i = 4; i >= 0; i--) cnt[i] += cnt[i+1]; //dp[t] : 今まででたのがtとなるようにするまでにかかるコストの期待値 map<array<int, 6>, double> dp; dp[cnt] = 0; //6, 5, 4, 4, 3, 2 -> 7, 6, 4, 4, 3, 2 : 辞書順で後にいく array<int, 6> A; for (A[0] = cnt[0]; A[0] >= 0; A[0]--) for (A[1] = min(A[0], cnt[1]); A[1] >= 0; A[1]--) for (A[2] = min(A[1], cnt[2]); A[2] >= 0; A[2]--) { for (A[3] = min(A[2], cnt[3]); A[3] >= 0; A[3]--) for (A[4] = min(A[3], cnt[4]); A[4] >= 0; A[4]--) for (A[5] = min(A[4], cnt[5]); A[5] >= 0; A[5]--) { double t = 0; int loop = 0; rep(i, 0, 6) { array<int, 6> B = A; rep(j, 0, i+1) B[j]++; rep(j, 0, 6) B[j] = min(B[j], cnt[j]); if (A != B) { t += dp[B]; } else loop++; } if (loop == 6) continue; t += 6; t /= (6 - loop); dp[A] = t; } } cout << dp[{0, 0, 0, 0, 0, 0}] << endl; }