洛谷 P3385 【模板】负环
题目链接:P3385 【模板】负环
思路
负环模版题,套一个SPFA板子,判断一下每个节点进入队列的次数,当进入队列的次数大于等于n次时,表示当前节点迭代次数超过了n - 1次,即为存在负环。
代码
#include <bits/stdc++.h> using namespace std; #define ll long long const ll INF = 0x3f3f3f3f; const int N = 1e5 + 10; struct List { ll head[N], edge[N], next[N], dis[N], cnt, res[N]; // 判断负环 int count[N], flag; bool vis[N]; // 处理邻接表 void add(int x, int y, int distance) { next[++cnt] = head[x]; head[x] = cnt; edge[cnt] = y; dis[cnt] = distance; } void SPFA(int start, int n) { memset(count, 0, sizeof count); memset(vis, 0, sizeof vis); memset(res, 0x3f, sizeof res); queue<int> q; q.push(start); res[start] = 0; vis[start] = true; while (!q.empty()) { int point = q.front(); q.pop(); vis[point] = false; for (int i = head[point]; i; i = next[i]) { if (res[edge[i]] > dis[i] + res[point]) { res[edge[i]] = dis[i] + res[point]; count[edge[i]] = count[point] + 1; if (count[edge[i]] >= n) { cout << "YES" << endl; flag = 1; return; } if (!vis[edge[i]]) { q.push(edge[i]); vis[edge[i]] = true; } } } } } void adjacentList() { memset(head, 0, sizeof head); cnt = 0, flag = 0; int n, m, s; cin >> n >> m; for (int i = 1; i <= m; i++) { ll u, v, w; cin >> u >> v >> w; add(u, v, w); if (w >= 0) add(v, u, w); } SPFA(1, n); if (flag == false) { cout << "NO" << endl; } // cout << res[n] << endl; } }; int main() { int t; cin >> t; List list; while (t--) { list.adjacentList(); } return 0; }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)