結果
| 問題 |
No.1320 Two Type Min Cost Cycle
|
| コンテスト | |
| ユーザー |
satashun
|
| 提出日時 | 2020-12-17 00:13:32 |
| 言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
AC
|
| 実行時間 | 656 ms / 2,000 ms |
| コード長 | 4,054 bytes |
| コンパイル時間 | 2,784 ms |
| コンパイル使用メモリ | 210,808 KB |
| 最終ジャッジ日時 | 2025-01-17 02:08:39 |
|
ジャッジサーバーID (参考情報) |
judge5 / judge1 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 57 |
ソースコード
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using pii = pair<int, int>;
template <class T>
using V = vector<T>;
template <class T>
using VV = V<V<T>>;
#define pb push_back
#define eb emplace_back
#define mp make_pair
#define fi first
#define se second
#define rep(i, n) rep2(i, 0, n)
#define rep2(i, m, n) for (int i = m; i < (n); i++)
#define per(i, b) per2(i, 0, b)
#define per2(i, a, b) for (int i = int(b) - 1; i >= int(a); i--)
#define ALL(c) (c).begin(), (c).end()
#define SZ(x) ((int)(x).size())
constexpr ll TEN(int n) { return (n == 0) ? 1 : 10 * TEN(n - 1); }
template <class T, class U>
void chmin(T& t, const U& u) {
if (t > u) t = u;
}
template <class T, class U>
void chmax(T& t, const U& u) {
if (t < u) t = u;
}
template <class T, class U>
ostream& operator<<(ostream& os, const pair<T, U>& p) {
os << "(" << p.first << "," << p.second << ")";
return os;
}
template <class T>
ostream& operator<<(ostream& os, const vector<T>& v) {
os << "{";
rep(i, v.size()) {
if (i) os << ",";
os << v[i];
}
os << "}";
return os;
}
#ifdef LOCAL
void debug_out() { cerr << endl; }
template <typename Head, typename... Tail>
void debug_out(Head H, Tail... T) {
cerr << " " << H;
debug_out(T...);
}
#define debug(...) \
cerr << __LINE__ << " [" << #__VA_ARGS__ << "]:", debug_out(__VA_ARGS__)
#define dump(x) cerr << __LINE__ << " " << #x << " = " << (x) << endl
#else
#define debug(...) (void(0))
#define dump(x) (void(0))
#endif
const ll INF = TEN(15);
VV<pii> g;
int main() {
int T, N, M;
cin >> T >> N >> M;
g.resize(N);
if (T == 0) {
ll ans = INF;
V<pair<pii, int>> es;
rep(i, M) {
int a, b, w;
cin >> a >> b >> w;
--a, --b;
es.eb(mp(a, b), w);
}
rep(i, M) {
pii pr = es[i].fi;
int ct = es[i].se;
int s = pr.fi;
g.clear();
g = VV<pii>(N);
rep(j, M) if (j != i) {
g[es[j].fi.fi].eb(es[j].fi.se, es[j].se);
g[es[j].fi.se].eb(es[j].fi.fi, es[j].se);
}
V<ll> d(N, INF);
d[s] = 0;
using Data = pair<ll, int>;
priority_queue<Data, V<Data>, greater<Data>> que;
que.emplace(0ll, s);
while (!que.empty()) {
auto t = que.top();
que.pop();
int v = t.se;
if (d[v] < t.fi) continue;
for (auto& [to, w] : g[v]) {
if (d[to] > d[v] + w) {
d[to] = d[v] + w;
que.emplace(d[to], to);
}
}
}
if (d[pr.se] != INF) {
// debug(pr, d[pr.se], ct);
chmin(ans, d[pr.se] + ct);
}
}
if (ans == INF) ans = -1;
cout << ans << endl;
} else {
rep(i, M) {
int a, b, w;
cin >> a >> b >> w;
--a, --b;
g[a].eb(b, w);
}
ll ans = INF;
rep(s, N) {
V<ll> d(N, INF);
d[s] = 0;
using Data = pair<ll, int>;
priority_queue<Data, V<Data>, greater<Data>> que;
que.emplace(0ll, s);
while (!que.empty()) {
auto t = que.top();
que.pop();
int v = t.se;
if (d[v] < t.fi) continue;
for (auto& [to, w] : g[v]) {
if (d[to] > d[v] + w) {
d[to] = d[v] + w;
que.emplace(d[to], to);
}
}
}
rep(t, N) {
for (auto& [to, w] : g[t]) {
if (to == s) {
chmin(ans, d[t] + w);
}
}
}
}
if (ans == INF) ans = -1;
cout << ans << endl;
}
return 0;
}
satashun