結果
| 問題 |
No.2712 Play more!
|
| ユーザー |
blue_jam
|
| 提出日時 | 2024-03-31 23:52:16 |
| 言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
AC
|
| 実行時間 | 109 ms / 2,000 ms |
| コード長 | 2,362 bytes |
| コンパイル時間 | 4,649 ms |
| コンパイル使用メモリ | 256,556 KB |
| 最終ジャッジ日時 | 2025-02-20 18:31:29 |
|
ジャッジサーバーID (参考情報) |
judge3 / judge1 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 33 |
ソースコード
#include <bits/stdc++.h>
#include <atcoder/all>
using namespace std;
using namespace atcoder;
using ll = long long;
template<typename T>
struct Edge {
ll from, to;
T weight;
Edge() : from(-1), to(-1) {}
Edge(ll from, ll to, T weight) :
from(from), to(to), weight(weight) {}
};
template<typename T>
struct Graph {
ll n;
vector<vector<Edge<T>>> edges;
Graph(ll n) : n(n), edges(n) {}
void add(ll from, ll to, T weight) {
edges[from].emplace_back(from, to, weight);
}
};
template<typename T, T (*add)(T, T), bool (*lt)(T, T), T (*zero)(), T (*inf)()>
struct BellmanFord {
Graph<T> g;
vector<T> dist;
vector<ll> prev;
bool hasNegativeLoop;
BellmanFord(Graph<T> g) : g(g), dist(g.n, inf()), prev(g.n, -1), hasNegativeLoop(false) {}
bool run(int s) {
const T INF = inf();
const auto eq = [](T a, T b) { return !lt(a, b) && !lt(b, a); };
int n = g.n;
dist[s] = zero();
for (int k = 0; k < 2 * n; ++k) {
for (int v = 0; v < n; ++v) {
for (auto &e: g.edges[v]) {
if (!eq(dist[e.from], INF) && lt(dist[e.from] + e.weight, dist[e.to])) {
dist[e.to] = dist[e.from] + e.weight;
prev[e.to] = e.from;
if (k >= n - 1) {
dist[e.to] = -INF;
hasNegativeLoop = true;
}
}
}
}
}
return hasNegativeLoop;
}
};
auto add = [](ll a, ll b) { return a + b; };
auto lt = [](ll a, ll b) { return a < b; };
auto zero = []() { return (ll) 0; };
auto inf = []() { return (ll) 1e17; };
void solveE() {
ll N, M;
cin >> N >> M;
vector<ll> A(N);
for (ll i = 0; i < N; i++) {
cin >> A[i];
}
Graph<ll> g(N);
for (ll i = 0; i < M; i++) {
ll a, b, c;
cin >> a >> b >> c;
a--;
b--;
g.add(a, b, c - A[b]);
}
BellmanFord<ll, add, lt, zero, inf> bellmanFord(g);
bellmanFord.run(0);
if (bellmanFord.dist[N - 1] == -inf()) {
cout << "inf" << endl;
} else {
cout << A[0] - bellmanFord.dist[N - 1] << endl;
}
}
int main() {
ios::sync_with_stdio(false);
solveE();
return 0;
}
blue_jam