博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
P3385 【模板】负环
阅读量:6699 次
发布时间:2019-06-25

本文共 1817 字,大约阅读时间需要 6 分钟。


bfs—spfa太慢,对于判负环

就只能用dfs—spfa

判负环的依据,具体会体现在code中

还有一道题也是判环

思路也是类似

#include
#include
#include
#include
using namespace std;struct node{ int point; int nxt; int weight;};int head[500000],tail;node line[500000];int dis[500000];int vis[500000];bool flag;void add(int a,int b,int c){ line[++tail].point=b; line[tail].nxt=head[a]; line[tail].weight=c; head[a]=tail;}void spfa(int x){ vis[x]=true; for(int i=head[x];i;i=line[i].nxt) { if(dis[line[i].point]>dis[x]+line[i].weight) { if(vis[line[i].point]||flag) { flag=true; return ; } dis[line[i].point]=dis[x]+line[i].weight; spfa(line[i].point); } } vis[x]=false;}int main(){ int t; scanf("%d",&t); for(int l=1;l<=t;l++) { int n,m; memset(vis,0,sizeof(vis)); memset(dis,0,sizeof(dis));//全置为0,这样正数边权就会被dfs时剪掉。只留下负数边权 memset(head,0,sizeof(head)); tail=0; flag=false; scanf("%d%d",&n,&m); int a,b,c; for(int i=1;i<=m;i++) { scanf("%d%d%d",&a,&b,&c); if(c>=0) { add(a,b,c); add(b,a,c); } else add(a,b,c); } for(int i=1;i<=n;i++) { spfa(i);//每个点一个跑一边 //不过为什么是正确的呢? //如果和一个点与之相连的边都是正数,我们根本不能确定它是不是在负权环上 //但是如果一条边是负数,它有很大可能在负权边上。大体理会下[]~( ̄▽ ̄)~* if(flag) break; } if(flag) printf("YE5\n"); else printf("N0\n"); }}/*3 41 2 21 3 42 3 13 1 -33 31 2 32 3 43 1 -8*/

转载于:https://www.cnblogs.com/Lance1ot/p/8708727.html

你可能感兴趣的文章
我的友情链接
查看>>
四元數與旋轉
查看>>
开始nodejs+express的学习+实践(8)
查看>>
java-递归折半查找法
查看>>
RPM的用法
查看>>
收集整理的非常有用的PHP函数
查看>>
css3图标悬停导航菜单
查看>>
linux下搭建FTP服务器
查看>>
c语言数组问题解析
查看>>
Windows 7操作系统使用移动硬盘快速安装
查看>>
DuangDuangDuang!码云项目的 Readme.md 特殊技能
查看>>
笔记--相册
查看>>
LINUX添加一块网卡地址配置及问题
查看>>
lastb
查看>>
[置顶] cocos2d-x 手游源码站
查看>>
2016年学习Linux决心书(老男孩教育在线课程班第二期)
查看>>
Linux文件系统
查看>>
37signals为何砍掉中层?个人点评,高素质人才队伍工作,靠的是全体发挥综合能力,而不是靠......
查看>>
从表到里学习JVM实现
查看>>
关于数据库查询优化的思考
查看>>