結果
| 問題 |
No.19 ステージの選択
|
| ユーザー |
wait_sushi
|
| 提出日時 | 2020-01-17 04:22:47 |
| 言語 | C++14 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
AC
|
| 実行時間 | 2 ms / 5,000 ms |
| コード長 | 2,910 bytes |
| コンパイル時間 | 2,114 ms |
| コンパイル使用メモリ | 183,240 KB |
| 実行使用メモリ | 5,376 KB |
| 最終ジャッジ日時 | 2024-06-25 00:16:53 |
| 合計ジャッジ時間 | 2,936 ms |
|
ジャッジサーバーID (参考情報) |
judge3 / judge5 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| other | AC * 24 |
ソースコード
#include <bits/stdc++.h>
using namespace std;
typedef long long int ll;
typedef vector<ll> vl;
typedef pair<ll, ll> PP;
#define rep(i, n) for(ll i = 0; i < ll(n); i++)
#define ITR(x, c) for(__typeof(c.begin()) x = c.begin(); x != c.end(); x++)
#define all(v) v.begin(), v.end()
#define inputv(v, n) \
vl v; \
rep(i, n) { \
ll x; \
cin >> x; \
v.push_back(x); \
}
const ll INF = 999999999999999;
const ll MOD = 1000000007;
ll a, b, c, d, e, f, p, t, x, y, z, q, m, n, r, h, k, w, l, ans = 0;
vector<bool> C(100001,false);
struct Gragh {
vector<vector<ll>> G;
ll N;
vl visited;
void init(ll n) {
N = n;
G.resize(N);
visited = vl(N, 0);
}
void add(ll a, ll b) { G[a].push_back(b); }
void resetv(void) { visited = vl(N, 0); }
vl active;
ll isloop = 0;
vl toposo;
vl TOPOSO(void) {
active.resize(N);
active = vl(N, 0);
visited = vl(N, 0);
rep(i, N) {
if(visited[i] == 0)
dfs(i);
}
reverse(all(toposo));
return toposo;
}
void dfs(ll x) {
visited[x] = 1;
active[x] = 1;
for(ll i : G[x]) {
if(visited[i] == 0) {
dfs(i);
} else {
if(active[i] == 1)
isloop = 1;
}
}
active[x] = 0;
toposo.push_back(x);
}
vl dag;
vector<vector<ll>> G2;
vl DAG(void) {
resetv();
G2.resize(N);
dag.resize(N);
rep(i, N) {
for(ll j : G[i]) {
G2[j].push_back(i);
}
}
ll v = 1;
rep(i, N) {
ll j = toposo[i];
if(visited[j] == 0)
dfs_dag(j, v);
v++;
}
return dag;
}
void dfs_dag(ll x, ll v) {
C[v]=true;
dag[x] = v;
visited[x] = 1;
for(ll j : G2[x]) {
if(visited[j] == 0)
dfs_dag(j, v);
else if(dag[j]!=v)C[dag[j]]=false;
}
}
};
int main() {
cin >> n;
Gragh G;
G.init(n);
vl A(n);
rep(i, n) {
cin >> x >> y;
G.add(i, y-1);
A[i]=x*2;
ans+=A[i];
}
G.TOPOSO();
vl B = G.DAG();
vl D[n+1];
rep(i,n){
D [B[i]].push_back(A[i]);
}
ans=ans/2;
rep(i,n+1){
sort(all(D[i]));
if(C[i])ans+=D[i][0]/2;
}
cout<<fixed<<setprecision(1)<<float(ans)/2<<endl;
}
wait_sushi