結果
| 問題 |
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);
}