結果
| 問題 |
No.19 ステージの選択
|
| ユーザー |
r_dream0
|
| 提出日時 | 2017-02-09 15:17:36 |
| 言語 | C++14 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
AC
|
| 実行時間 | 3 ms / 5,000 ms |
| コード長 | 2,484 bytes |
| コンパイル時間 | 961 ms |
| コンパイル使用メモリ | 75,880 KB |
| 実行使用メモリ | 5,248 KB |
| 最終ジャッジ日時 | 2024-12-23 10:06:10 |
| 合計ジャッジ時間 | 1,966 ms |
|
ジャッジサーバーID (参考情報) |
judge2 / judge1 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| other | AC * 24 |
ソースコード
#include <iostream>
#include <vector>
using namespace std;
typedef vector<vector<int> > matrix;
typedef int weight;
const int inf = 1 << 30;
/* FROM Spaghetti Source */
void backward_traverse(int v, int s, int r, matrix &g,
vector<int> &no, vector< vector<int> > &comp,
vector<int> &prev, vector<weight> &mcost,
vector<int> &mark, weight &cost, bool &found) {
const int n = g.size();
if (mark[v]) {
vector<int> temp = no;
found = true;
do {
cost += mcost[v];
v = prev[v];
if (v != s) {
while (comp[v].size() > 0) {
no[comp[v].back()] = s;
comp[s].push_back(comp[v].back());
comp[v].pop_back();
}
}
} while (v != s);
for (int j = 0; j < n; ++j)
if (j != r && no[j] == s)
for (int i = 0; i < n; ++i)
if (no[i] != s && g[i][j] < inf)
g[i][j] -= mcost[ temp[j] ];
}
mark[v] = true;
for (int i = 0; i < n; ++i)
if (no[i] != no[v] && prev[ no[i] ] == v)
if (!mark[ no[i] ] || i == s)
backward_traverse(i, s, r, g,
no, comp, prev, mcost, mark, cost, found);
}
weight minimum_spanning_arborescence(int r, matrix &g) {
const int n = g.size();
vector<int> no(n);
vector< vector<int> > comp(n);
for (int i = 0; i < n; ++i) {
no[i] = i;
comp[i].push_back(i);
}
weight cost = 0;
while (1) {
vector<int> prev(n, -1);
vector<weight> mcost(n, inf);
for (int i = 0; i < n; ++i) {
for (int j = 0; j < n; ++j) {
if (j == r) continue;
if (no[i] != no[j] && g[i][j] < inf) {
if (g[i][j] < mcost[ no[j] ]) {
mcost[ no[j] ] = g[i][j];
prev[ no[j] ] = no[i];
}
}
}
}
bool stop = true;
vector<int> mark(n);
for (int i = 0; i < n; ++i) {
if (i == r || mark[i] || comp[i].size() == 0) continue;
bool found = false;
backward_traverse(i, i, r, g,
no, comp, prev, mcost, mark, cost, found);
if (found) stop = false;
}
if (stop) {
for (int i = 0; i < n; ++i)
if (prev[i] >= 0)
cost += mcost[i];
return cost;
}
}
}
int main() {
int32_t N;
cin >> N;
matrix M(N + 1, vector<int>(N + 1, inf));
int L[N], S[N];
for(int i = 0; i < N; i++) {
cin >> L[i] >> S[i];
M[0][i + 1] = L[i] * 2;
M[S[i]][i + 1] = L[i];
}
int ret = minimum_spanning_arborescence(0, M);
cout << ret / 2 << "." << 5 * (ret % 2) << endl;
}
r_dream0