用SPFA判断是否存在负环
题目描述
暴力枚举/SPFA/Bellman-ford/奇怪的贪心/超神搜索
输入输出格式
输入格式:
第一行一个正整数T表示数据组数,对于每组数据:
第一行两个正整数N M,表示图有N个顶点,M条边
接下来M行,每行三个整数a b w,表示a->b有一条权值为w的边(若w<0则为单向,否则双向)
输出格式:
共T行。对于每组数据,存在负环则输出一行"YE5"(不含引号),否则输出一行"N0"(不含引号)。
负环指的是权值和为负数的环,用SPFA加上DFS做比较方便,如果用BFS来做就要遍历的话判断条件是入队n次,但不好操作。用DFS就好写多了
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<cmath> #include<stack> #include<stdlib.h> #include<map> #include<vector> #include<queue> #include<set> #include<ctype.h> #define zuida 100000 using namespace std; #define maxn 200005 struct node {int to;int next;int val; }bb[maxn]; int head[maxn]; int tot; int vis[maxn]; int dis[maxn]; int flag; void add(int a,int b,int c) {bb[++tot].next=head[a];bb[tot].to=b;bb[tot].val=c;head[a]=tot; } void spfa(int u) {if(flag)return;vis[u]=1;for(int i=head[u];i;i=bb[i].next){if(flag)return;int v=bb[i].to;if(dis[v]>bb[i].val+dis[u]){if(vis[v]){flag=1;cout<<v<<endl;return ;}dis[v]=dis[u]+bb[i].val;spfa(v);}}vis[u]=0; } int main() {int T;cin>>T;while(T--){tot=0;flag=0;int n,m;cin>>n>>m;memset(dis,0,sizeof(dis));memset(vis,0,sizeof(vis));memset(head,0,sizeof(head));dis[1]=0;int aa,bb,cc;for(int i=1;i<=m;i++){cin>>aa>>bb>>cc;add(aa,bb,cc);if(cc>=0)add(bb,aa,cc);}for(int i=1;i<=n;i++){spfa(i);if(flag)break;}if(flag)cout<<"YE5"<<endl;else cout<<"N0"<<endl;}return 0; }
转载于:https://www.cnblogs.com/SparkPhoneix/p/8885697.html
用SPFA判断是否存在负环相关推荐
- POJ 3259 Wormholes(bellman_ford,判断有没有负环回路)
题意:John的农场里field块地,path条路连接两块地,hole个虫洞,虫洞是一条单向路,不但会把你传送到目的地,而且时间会倒退Ts.我们的任务是知道会不会在从某块地出发后又回来,看到了离开之前 ...
- bellman ford 算法 判断是否存在负环
Flyer 目录视图 摘要视图 订阅 微信小程序实战项目--点餐系统 程序员11月书讯,评论得书啦 Get IT技能知识库,50个领域一键直达 关闭 bellman for ...
- F - Wormholes(判断是否存在负环)
##题目描述 While exploring his many farms, Farmer John has discovered a number of amazing wormholes. A w ...
- 解题报告:luoguP2868 Sightseeing Cows G(最优比率环,负环判定,二分答案)
根据题意,我们要环上各点权值之和除以各边权值之和最大. 求最大答案,很明显可以使用二分答案.那么我们假设当前答案为 x,如果有更大的答案,那么方程就可以按下图转换: 也就是说如果有更大的答案,则有一个 ...
- spfa判断负环( 负环判定 + spfa )
给定一个 n 个点 m 条边的有向图,图中可能存在重边和自环, 边权可能为负数. 请你求出 1 号点到 n 号点的最短距离,如果无法从 1 号点走到 n 号点,则输出 impossible. 数据保证 ...
- 【最短路径问题笔记】SPFA算法及负环的判断
dis数组:记录源点到每个结点最短路径值 in数组:记录结点进队次数 vis数组:记录结点是否在队列中 设立队列用来保存待优化的结点: 优化时每次取出队首结点cur,并且用cur点当前的最短路径对u点 ...
- 模板 - 判断负环(超时高效优化技巧)、01分数规划
整理的算法模板合集: ACM模板 判断负环 判正环求最长路,判负环求最短路 int n; // 总点数 int h[N], w[N], e[N], ne[N], idx; // 邻接表存储所有边 in ...
- 糖果(SPFA、判负环)
Description 幼儿园里有 N 个小朋友,老师现在想要给这些小朋友们分配糖果,要求每个小朋友都要分到糖果.但是小朋友们也有嫉妒心,总是会提出一些要求,比如小明不希望小红分到的糖果比他的多,于是 ...
- AcWing 904. 虫洞(SPFA or Djakarta or bellman判负环)
题目连接 http://poj.org/problem?id=3259 思路 大概是想问我们能不能找到一个负环,那么再看一眼数据范围,500,感觉乱搞都能过,但是出题人很恶心啊,n的范围并不是500, ...
最新文章
- mysql length函数无法对字段值为null的筛选
- java匿名类的用法
- 【译】Introducing scrcpy
- java 循环结构和常用的类 总结笔记
- python3爬虫初探(一)之urllib.request
- java threadlocal 缺点_Java的ThreadLocal如何在后台实现?
- Effective Modern C++翻译(3)-条款2:明白auto类型推导
- 静态代码块与静态函数的执行顺序
- 2.吴恩达机器学习课程-作业2-逻辑回归
- 【网络安全】大学信息安全技术 期末考试复习题
- Rtklib-rinex文件的读取(rinex.c)-序言
- 用python写1加到100怎么写_python计算1到100的和
- 产业分析:2022南京市产业全景
- 使用VAE(变分自动编码器),来预测用户流失.
- Python的正则表达式和re模块
- 开源论坛框架调研总结
- 漫画:什么是 “智能供应链” ?
- 数据小助手:chenzx.dataassistant.db.NoteColumn设计
- H323端口开放一览表
- iamp是什么意思计算机网络,IAMP是什么意思
热门文章
- MongoDB学习day10--数据库导入导出
- 深度学习最全优化方法总结比较(SGD,Adagrad,Adadelta,Adam,Adamax,Nadam)(转)...
- 四元数运动学笔记(1)旋转的表示
- English Through Movie
- [Tool] SourceTree初始化GitFlow遇到错误(git command not found)的解决方案
- 通过JAVA操作SAE上的MY SQL数据库
- 卡尔曼滤波器的一种形象表达
- tensorflow分类的loss函数_Tensorflow Keras的loss函数总结
- existed hive ods_hive数据仓库建设
- php去掉 部分字符,输出,php如何去除某个字符