結果
| 問題 |
No.468 役に立つ競技プログラミング実践編
|
| ユーザー |
|
| 提出日時 | 2017-05-05 03:42:36 |
| 言語 | C++14 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
MLE
|
| 実行時間 | - |
| コード長 | 1,677 bytes |
| コンパイル時間 | 828 ms |
| コンパイル使用メモリ | 75,600 KB |
| 実行使用メモリ | 814,848 KB |
| 最終ジャッジ日時 | 2024-09-14 07:29:39 |
| 合計ジャッジ時間 | 3,881 ms |
|
ジャッジサーバーID (参考情報) |
judge2 / judge5 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 21 MLE * 1 -- * 9 |
| other | AC * 3 -- * 3 |
ソースコード
#include <iostream>
#include <vector>
#include <limits>
int n, m;
std::vector<std::vector<int> > edge; // 隣接行列
std::vector<int> ent, lnt;
std::vector<int> rec, ser;
void calc_ent(int node) {
if (rec[node] != 0) {
return;
}
for (int i = 0; i < n; i++) {
if (edge[node][i] != -1) {
int t = ent[node] + edge[node][i];
if (t > ent[i]) {
ent[i] = t;
}
rec[i]--;
calc_ent(i);
}
}
rec[node]--;
return;
}
void calc_lnt(int node) {
if (ser[node] != 0) {
return;
}
for (int i = 0; i < n; i++) {
if (edge[i][node] != -1) {
int t = lnt[node] - edge[i][node];
if (t < lnt[i]) {
lnt[i] = t;
}
ser[i]--;
calc_lnt(i);
}
}
ser[node]--;
return;
}
int main() {
int tmp[3] = {0};
int c = 0;
std::cin >> n >> m;
edge.resize(n);
for (int i = 0; i < n; i++) {
edge[i].resize(n, -1);
}
ent.resize(n, 0);
ent[0] = 0;
lnt.resize(n, std::numeric_limits<int>::max());
rec.resize(n, 0);
ser.resize(n, 0);
for (int i = 0; i < m; i++) {
std::cin >> tmp[0] >> tmp[1] >> tmp[2];
if (tmp[2] > edge[tmp[0]][tmp[1]]) {
edge[tmp[0]][tmp[1]] = tmp[2];
ser[tmp[0]]++;
rec[tmp[1]]++;
}
}
calc_ent(0);
lnt[n-1] = ent[n-1];
calc_lnt(n-1);
for (int i = 0; i < n; i++) {
if (lnt[i] != ent[i]) {
c++;
}
}
std::cout << ent[n-1] << " " << c << "/" << n << std::endl;
}