結果
問題 |
No.19 ステージの選択
|
ユーザー |
|
提出日時 | 2025-06-07 17:28:31 |
言語 | D (dmd 2.109.1) |
結果 |
AC
|
実行時間 | 2 ms / 5,000 ms |
コード長 | 991 bytes |
コンパイル時間 | 5,791 ms |
コンパイル使用メモリ | 205,100 KB |
実行使用メモリ | 6,272 KB |
最終ジャッジ日時 | 2025-06-07 17:28:39 |
合計ジャッジ時間 | 7,100 ms |
ジャッジサーバーID (参考情報) |
judge5 / judge1 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
other | AC * 24 |
ソースコード
module main; // https://kmjp.hatenablog.jp/entry/2014/11/05/0930 より // 強連結成分分解 import std; int N; int[] L, S; bool[] visited, done; int dfs(int cur, int tar) { int x; if (done[S[cur]]) return -1; if (cur == tar) return tar; if (visited[S[cur]]) return -1; visited[cur] = true; x = dfs(S[cur], tar); if (x < 0) return -1; if (L[cur] < L[x]) return cur; return x; } void main() { // 入力 N = readln.chomp.to!int; L = new int[](N), S = new int[](N); visited = new bool[](N), done = new bool[](N); foreach (i; 0 .. N) { readln.chomp.formattedRead("%d %d", L[i], S[i]); --S[i]; L[i] *= 2; } // 答えの計算 int ans = 0; foreach (i; 0 .. N) { if (done[i]) continue; visited[] = false; int x = dfs(S[i], i); if (x >= 0) { ans += L[x]; done[x] = true; } } foreach (i; 0 .. N) foreach (j; 0 .. N) if (done[S[j]] && !done[j]) { done[j] = true; ans += L[j] / 2; } // 答えの出力 writefln("%.1f", ans / 2.0); }