結果
| 問題 |
No.19 ステージの選択
|
| ユーザー |
btk
|
| 提出日時 | 2015-05-07 01:47:51 |
| 言語 | C++11(廃止可能性あり) (gcc 13.3.0) |
| 結果 |
WA
|
| 実行時間 | - |
| コード長 | 1,552 bytes |
| コンパイル時間 | 1,071 ms |
| コンパイル使用メモリ | 96,248 KB |
| 実行使用メモリ | 6,944 KB |
| 最終ジャッジ日時 | 2024-07-05 19:22:10 |
| 合計ジャッジ時間 | 1,873 ms |
|
ジャッジサーバーID (参考情報) |
judge3 / judge1 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| other | AC * 12 WA * 12 |
ソースコード
#include<iostream>
#include<fstream>
#include<sstream>
#include<string>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<ctime>
#include<stack>
#include<queue>
#include<set>
#include<map>
#include<vector>
#include<list>
#include<algorithm>
#include<utility>
#include<complex>
#include<functional>
using namespace std;
bool used[100];
int p[100];
int num = 0;
vector<list<int>> good;
vector<list<int>> bad;
int level[100];
void dfs(int s){
used[s] = true;
for(auto v : good[s])
{
if (used[v])continue;
dfs(v);
}
p[num++] = s;
}
int bfs(int s){
int res = level[s];
int mini = res;
int cnt = 1;
queue<int> que;
que.push(s);
used[s] = true;
if (bad[s].size() == 0)return level[s] * 2;
while (que.empty() == false){
auto v = que.front(); que.pop();
//cout << v << " ";
for(auto u :bad[v])
{
if (used[u])continue;
used[u] = true;
que.push(u);
res += level[u];
mini = min(mini, level[u]);
cnt++;
}
}
if (cnt > 1)res += mini;
// cout << endl;
return res;
}
int main(void){
int N,s,sum=0;
cin >> N;
good.resize(N);
bad.resize(N);
for (int i = 0; i < N; i++)
{
used[i] = false;
cin >> level[i] >> s;
s--;
if (s != i){
good[s].push_back(i);
bad[i].push_back(s);
}
}
for (int i = 0; i < N; i++)
{
if (used[i])continue;
dfs(i);
}
reverse(p, p + N);
for (int i = 0; i < N; i++)
{
used[i] = false;
// cout << p[i] << " ";
}
//cout << endl;
for (int i = 0; i < N; i++)
{
if (used[p[i]])continue;
sum += bfs(p[i]);
}
cout << sum / 2.0 << endl;
return 0;
}
btk