結果
| 問題 |
No.19 ステージの選択
|
| ユーザー |
|
| 提出日時 | 2019-11-24 09:01:32 |
| 言語 | C++14 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
AC
|
| 実行時間 | 2 ms / 5,000 ms |
| コード長 | 1,348 bytes |
| コンパイル時間 | 986 ms |
| コンパイル使用メモリ | 76,012 KB |
| 実行使用メモリ | 5,248 KB |
| 最終ジャッジ日時 | 2024-10-12 04:15:13 |
| 合計ジャッジ時間 | 1,547 ms |
|
ジャッジサーバーID (参考情報) |
judge5 / judge3 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| other | AC * 24 |
ソースコード
#include<iostream>
#include<vector>
#include<numeric>
using namespace std;
vector<int> v[100], rev[100], vs, par(100);
vector<bool> used(100);
void dfs(int x){
used[x] = true;
for(int next : v[x]){
if(!used[next]) dfs(next);
}
vs.push_back(x); // postorder
}
void rdfs(int x, int k){
used[x] = true;
par[x] = k;
for(int next : rev[x]){
if(!used[next]) rdfs(next, k);
}
}
int main(){
int n;
cin >> n;
vector<double> score(n);
for(int i = 0; i < n; i++){
int s;
cin >> score[i] >> s;
s--;
v[s].push_back(i);
rev[i].push_back(s);
}
fill(used.begin(), used.end(), 0);
for(int i = 0; i < n; i++){
if(!used[i]) dfs(i);
}
fill(used.begin(), used.end(), 0);
int comp = 0;
for(int i = n-1; i >= 0; i--){
if(!used[vs[i]]) rdfs(vs[i], comp++);
}
double ans = accumulate(score.begin(), score.end(), 0) / 2.0;
for(int i = 0; i < comp; i++){
bool in = false;
double mi = 1e9;
for(int j = 0; j < n; j++){
if(par[j] != i) continue;
mi = min(mi, score[j]);
for(int k : rev[j]){
in |= par[k] != i;
}
}
if(in) continue;
ans += mi/2;
}
printf("%.1f\n", ans);
return 0;
}