結果
| 問題 |
No.468 役に立つ競技プログラミング実践編
|
| コンテスト | |
| ユーザー |
dnish
|
| 提出日時 | 2018-07-02 19:07:07 |
| 言語 | C++14 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
AC
|
| 実行時間 | 367 ms / 2,000 ms |
| コード長 | 2,406 bytes |
| コンパイル時間 | 2,014 ms |
| コンパイル使用メモリ | 184,352 KB |
| 実行使用メモリ | 33,932 KB |
| 最終ジャッジ日時 | 2024-07-01 01:36:09 |
| 合計ジャッジ時間 | 8,493 ms |
|
ジャッジサーバーID (参考情報) |
judge1 / judge3 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 31 |
| other | AC * 6 |
ソースコード
#include "bits/stdc++.h"
#define REP(i, n, N) for(ll i=(n); i<(N); i++)
#define RREP(i, n, N) for(ll i=(N-1); i>=n; i--)
#define CK(n, a, b) ((a)<=(n)&&(n)<(b))
#define ALL(v) (v).begin(),(v).end()
#define MCP(a,b) memcpy(b,a,sizeof(b))
#define p(s) cout<<(s)<<endl
#define p2(a, b) cout<<(a)<<" "<<(b)<<endl
#define v2(T) vector<vector<T>>
typedef long long ll;
using namespace std;
const ll mod = 1e9 + 7;
const ll inf = 1e18;
const ll NODE_SIZE = 101010;
ll N;
ll M;
vector<vector<pair<ll, ll>>> edge(NODE_SIZE); //<ノード, コスト>
vector<vector<pair<ll, ll>>> edge2(NODE_SIZE); //<ノード, コスト>
ll d[NODE_SIZE]; //始点ノードからノードiへの最短距離
ll start; //開始ノード番号
ll rev[NODE_SIZE]; //一個前を覚える
vector<ll> tsort(vector<vector<pair<ll, ll>>> g) {
ll k = 0;
vector<ll> in(N,0);
vector<ll> ord(N);
// 自分に繋がっているエッジの次数カウント
for (auto es : g)
for (auto e : es) in[e.first]++;
queue<ll> q;
for (ll i = 0; i < N; ++i)
if (in[i] == 0) q.push(i);
while (!q.empty()) {
ll node = q.front();
q.pop();
ord[k++] = node;
for (auto e : g[node])
if (--in[e.first] == 0){
q.push(e.first); //使ってもいいノードの追加
}
}
return *max_element(in.begin(), in.end()) == 0 ? ord : vector<ll>();
}
int main(){
cin>>N>>M;
ll A,B,C;
REP(i,0,M){
cin>>A>>B>>C;
edge[A].emplace_back(B,C);
edge2[B].emplace_back(A,C);
}
vector<ll> route = tsort(edge);
vector<ll> D(N, -inf);
D[route[0]] = 0;
//最早
for(auto v: route) {
for(auto uc: edge[v]) {
ll node = uc.first;
ll c = uc.second;
D[node] = max(D[node], D[v] + c); //一番時間がかかる有向辺
}
}
ll T = D[route[N-1]];
vector<bool> used(N,0);
used[route[N-1]] = 1;
//最遅
reverse(route.begin(), route.end());
for(auto v: route) {
if (!used[v]) continue;
for(auto uc: edge2[v]) {
ll node = uc.first;
ll cost = uc.second;
if (D[node] + cost == D[v]) {
used[node] = 1;
}
}
}
ll P = count(used.begin(), used.end(),true);
P = N-P;
printf("%lld %lld/%lld\n", T, P, N);
return 0;
}
dnish