当前位置:首页 > 编程笔记 > 正文
已解决

bellman_ford算法判负环-洛谷P3371

来自网友在路上 168868提问 提问时间:2023-11-04 08:12:13阅读次数: 68

最佳答案 问答题库688位专家为你答疑解惑

总结:这题改了很久,一直wa

问题一:多测要清空数组

问题二:本题其实有点特殊,它要求的是,从1开始出发能到达的负环,也就是这个1实际上必须能到这个负环,如果图不连通,就会出现有负环但1去不了,等于没有负环的情况,这种特殊情况bellman_ford算法是压根没法解决的 一个玄学方法就是:判断1是否有出度,但实际上这个玄学方法仅仅能过这题的特例,换一个1有出度到不了的负环就hack住了

#pragma optimize(2)
#include<bits/stdc++.h>
#include<unordered_map>
#include<unordered_set>
#define endl '\n'
#define int int64_t
using namespace std;
const int N = 1e5 + 10;
struct edge { int v, w; };
vector<edge>e[N];
int d[N],m,n;
bool bellman_ford(int s) {memset(d, 0x3f3f3f3f, sizeof d);d[s] = 0;bool sign;for (int i = 1; i <= n; ++i) {//次数sign = false;for (int u = 1; u <= n; ++u) {//顶点if (d[u] == 0x3f3f3f3f)continue;for (auto k : e[u]) {if (d[k.v] > d[u] + k.w) {d[k.v] = d[u] + k.w;sign = true;}}}if (!sign) break;}return sign;
}
signed main() {ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);int t,a,b,c; cin >> t;while (t--) {for (int i = 1; i <= n; ++i) e[i].erase(e[i].begin(), e[i].end());cin >> n >> m;for (int i = 1; i <= m; ++i) {cin >> a >> b >> c;e[a].push_back({ b,c });if (c >= 0) e[b].push_back({ a,c });}if (bellman_ford(1)) {if (e[1].size()) cout << "YES" << endl;else cout << "NO" << endl;}else cout << "NO" << endl;}return 0;
}

查看全文

99%的人还看了

相似问题

猜你感兴趣

版权申明

本文"bellman_ford算法判负环-洛谷P3371":http://eshow365.cn/6-31625-0.html 内容来自互联网,请自行判断内容的正确性。如有侵权请联系我们,立即删除!