ACM - 图论 - P3385 负环
题目描述
给定一个 \(n\) 个点的有向图,请求出图中是否存在从顶点 \(1\) 出发能到达的负环。
负环的定义是:一条边权之和为负数的回路。
输入格式
本题单测试点有多组测试数据。
输入的第一行是一个整数 \(T\),表示测试数据的组数。对于每组数据的格式如下:
第一行有两个整数,分别表示图的点数 \(n\) 和接下来给出边信息的条数 \(m\)。
接下来 \(m\) 行,每行三个整数 \(u\),\(v\),\(w\)。
若 \(w \geqslant 0\),则表示存在一条从 \(u\) 至 \(v\) 边权为 \(w\) 的边,还存在一条从 \(v\) 至 \(u\) 边权为 \(w\) 的边。
若 \(w < 0\),则只表示存在一条从 \(u\) 至 \(v\) 边权为 \(w\) 的边。
输出格式
对于每组数据,输出一行一个字符串,若所求负环存在,则输出YES,否则输出NO。
输入输出样例
输入 #1
2
3 4
1 2 2
1 3 4
2 3 1
3 1 -3
3 3
1 2 3
2 3 4
3 1 -8
输出 #1
NO
YES
数据规模
对于全部的测试点,保证:
\(
1 \leqslant n \leqslant 2 \times 10^{3}, 1 \leqslant m \leqslant 3 \times 10^{3}
\)\(
1 \leqslant u,v \leqslant n, 10^{-4} \leqslant w \leqslant 10^{-4}
\)\(
1 \leqslant T \leqslant 10
\)
题解
该题是一个判断给定图中是否存在负环(或负权回路)的模板题。
使用 \(Bellman-Ford\) 算法判负环。补充,\(SPFA\) 算法也可以判负环,但个人感觉没有该算法自然,而且两者时间复杂度相差不大,感兴趣的都可以实现一下,之后有时间会在此题补充图论中判负环的算法。
代码实现如下:
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
#include<vector>
#include<queue>
#define PII pair<int, int>
#define INF 0x3f3f3f3f
using namespace std;
struct edge
{
int u; // 边的起点
int v; // 边的终点
int w; // 边的权值
};
const int N = 2005; // 最大点数
const int M = 3005; // 最大边数
int n, m, q;
vector<edge> es; // 用邻接表存储边
int dist[N]; // 第i号点距离源点的当前最短距离
int vis[N]; // vis数组存的是当前结点是否在队列中
int releax(int e)
{
if (dist[es[e].u] == INF) {
return 0;
}
else if (dist[es[e].u] + es[e].w < dist[es[e].v]) {
dist[es[e].v] = dist[es[e].u] + es[e].w;
return 1;
}
return 0;
}
bool bellman()
{
int sz = es.size();
for (int i = 1; i <= n; ++i) {
int flag = 1;
for (int j = 0; j < sz; ++j) {
if (releax(j)) {
flag = 0;
}
}
if (flag) return false;
}
for (int i = 0; i < sz; ++i) {
if (releax(i)) return true;
}
return false;
}
int main()
{
int T;
cin >> T;
while (T--) {
// 初始化
es.clear();
memset(dist, 0x3f, sizeof(dist));
memset(vis, 0, sizeof(vis));
cin >> n >> m;
dist[1] = 0;
vis[1] = 1;
int u, v, w;
for (int i = 0; i < m; ++i) {
cin >> u >> v >> w;
if (w >= 0) {
edge tmpe1 = { u, v, w };
edge tmpe2 = { v, u, w };
es.push_back(tmpe1);
es.push_back(tmpe2);
}
else {
edge tmpe = { u, v, w };
es.push_back(tmpe);
}
}
if (bellman()) cout << "YES" << endl;
else cout << "NO" << endl;
}
return 0;
}
ACM - 图论 - P3385 负环的更多相关文章
- 【luogu P3385 负环】 模板
题目链接:https://www.luogu.org/problemnew/show/P3385 SPFA判负环. 这个题必须卡一卡才过得去. 按理说对于一个负环点应当是入队 > n次. 但是这 ...
- 洛谷P3385负环
传送门 #include <iostream> #include <cstdio> #include <cstring> #include <algorith ...
- 【洛谷 P3385】模板-负环(图论--spfa)
题目:有一个图有N个顶点,M条边.边用三个整数a b w表示,意思为a->b有一条权值为w的边(若w<0则为单向,否则双向).共T组数据.对于每组数据,存在负环则输出一行"YE5 ...
- [P3385]【模板】负环 (spfa / bellman-ford)
终于开始认真对待图论了 因为听说一直是提高组的,动得很少,直到现在机房打提高的氛围下,开始学一些皮毛的东西 模板题目链接 这是一道求负环的题目,照理来说大家都是用spfa来判断负环的 但是我觉得bel ...
- 「P3385」【模板】负环(spfa
题目描述 暴力枚举/SPFA/Bellman-ford/奇怪的贪心/超神搜索 输入输出格式 输入格式: 第一行一个正整数T表示数据组数,对于每组数据: 第一行两个正整数N M,表示图有N个顶点,M条边 ...
- 洛谷P3385判负环——spfa
题目:https://www.luogu.org/problemnew/show/P3385 两种方法,dfs和bfs: 一开始写的dfs,要把dis数组初值赋成0,这样从一个连着负边的点开始搜: 在 ...
- 洛谷 P3385 【模板】负环
P3385 [模板]负环 题目描述 暴力枚举/SPFA/Bellman-ford/奇怪的贪心/超神搜索 输入输出格式 输入格式: 第一行一个正整数T表示数据组数,对于每组数据: 第一行两个正整数N M ...
- 洛谷 P3385 【模板】负环 题解
P3385 [模板]负环 题目描述 暴力枚举/SPFA/Bellman-ford/奇怪的贪心/超神搜索 寻找一个从顶点1所能到达的负环,负环定义为:一个边权之和为负的环. 输入格式 第一行一个正整数T ...
- 模板+解题报告:luogu P3385 【模板】负环
题目链接:P3385 [模板]负环 缩点板子. 看日报上说\(DFS\)会炸(我确实打炸了),就根据他的说明\(yy\)了\(BFS\),多一个记录步数的数组即可(我用的\(len[]\)),若\(l ...
随机推荐
- 【C# IO 操作】 Path 路径类 |Directory类 |DirectoryInfo 类|DriveInfo类|File类|FileInfo类|FileStream类
Directory类 Directory类 是一个静态类,常用的地方为创建目录和目录管理. 一下来看看它提供的操作. 1.CreateDirectory 根据指定路径创建目录.有重载,允许一次过创建多 ...
- 基于angularJs坐标转换指令(经纬度中的度分秒转化为小数形式 )
最近项目中,需要用户输入经纬度信息,因为数据库设计的时候,不可能分三个字段来存储这种信息,只能用double类型来进行存储. 计算公式 double r=度+分/60+秒/3600 <!DOC ...
- vue项目npm run dev 报错error in ./src/main.js Module build failed: ReferenceError: Unknown plugin "transform-vue-jsx" specified in......
问题: vue项目npm run dev运行时报错,如下图: 原因: 缺少组件 解决办法: 安装相应的组件: npm install babel-plugin-transform-vue-jsx ...
- k8s全方位监控-prometheus-配置文件介绍以及基于文件服务发现
1.scrape_configs 参数介绍 # 默认的全局配置 global: scrape_interval: 15s # 采集间隔15s,默认为1min一次 evaluation_interval ...
- gvim 配置vimrc
##################################################################### normal setup################## ...
- Chapter05 流程控制(Process Control)
目录 Chapter05 流程控制 5.1 顺序控制 5.2 分支控制 if-else 单分支基本语法: 双分支基础语法: 多分支基础语法 5.3 嵌套分支 5.4 switch分支结构 5.5 Fo ...
- linux作业--第七周
1.解决DOS攻击生产案例:根据web日志或者或者网络连接数,监控当某个IP 并发连接数或者短时内PV达到100,即调用防火墙命令封掉对应的IP,监控频率每隔5分钟.防火墙命令为:iptables - ...
- java上传图片时压缩图片
/** * 函数:调整图片尺寸或生成缩略图 v 1.1 * @param $Image 需要调整的图片(含路径) * @param $Dw 调整时最大宽度;缩略图时的绝对宽度 * @param $Dh ...
- 怎么样在手机调试js,jq,html,如何在手机上调试js,javascript
方法 直接在html中引入vconsole.js文件, 然后在js脚本中使用console.log('调试内容'); 即可看到如下效果,还可以在network里面看到ajax请求 我把js文件传到博客 ...
- LGP6694题解
第一眼似乎很困难,实际上非常简单( 好吧这题我做了一个小时( 首先期望具有线性性,我们转化为计算点对对答案的贡献. 发现相对位置一样的点对对答案的贡献是一样的.我们把相对位置一样的点对铃出来,乘了之后 ...