結果

問題 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
権限があれば一括ダウンロードができます

ソースコード

diff #

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);
}
0