思路简记
建图后,可以枚举每个点作为起点跑 Dijkstra。如果最短路过程中再次回到起点,就得到经过该点的一个最小环候选值;再结合题目给定的阈值判断答案。
代码
#include <bits/stdc++.h>
using namespace std;
const int N = 2010;
const int INF = 0x3f3f3f3f;
vector<pair<int, int>> e[N];
int n, m, c, minn, dist[N];
bool st[N];
void Dijkstra(int u) {
minn = INF;
for (int i = 1; i <= n; i++) {
dist[i] = INF;
st[i] = false;
}
priority_queue<pair<int, int>, vector<pair<int, int>>, greater<pair<int, int>>> q;
dist[u] = 0;
q.push({dist[u], u});
while (!q.empty()) {
auto [dis, ver] = q.top();
q.pop();
if (st[ver]) continue;
st[ver] = true;
for (auto [v, w] : e[ver]) {
if (v == u) minn = min(minn, dis + w);
if (st[v]) continue;
if (dist[v] > dis + w) {
dist[v] = dis + w;
q.push({dist[v], v});
}
}
}
}
void solve() {
cin >> n >> m >> c;
int ans = 0;
for (int i = 1; i <= m; i++) {
int u, v, z;
cin >> u >> v >> z;
e[u].push_back({v, z});
if (z <= c) ans = 1;
}
for (int i = 1; i <= n; i++) {
Dijkstra(i);
if (minn <= c) {
ans = 2;
break;
}
}
cout << ans << "\n";
}