这个承认自己没看懂题目,一开始以为题意是形成环路之后走一圈不会产生负值就输出,原来就是判断负环,用SPFA很好用,运用队列,在判断负环的时候,用一个数组专门保存某个点的访问次数,超过了N次即可断定有负环(其实我觉得=N次了就可以断定了,当然这样是保险起见)。。。。别人还有用SPFA+DFS做的,还效率相当高,我还没怎么弄明白是怎么回事。。。还有,我突然想到讲最短路的时候说迪杰斯特拉不能用于有负权的图,这是为什么。。我还没想明白,先去睡觉吧。。。。

关于dijstla为什么不能有负权,昨晚躺下之后就想明白了,dijstla最大特性在于其把当前d值最小的点给灰化了,下次不用再访问了,而负权如果存在,将使得已经发生灰化的点,d值会变小,这样就不得不取消灰化,但一旦取消,dijstla就永远无法走到终点,(将一直在d值最小的那个点徘徊),因此spfa通过用队列把d值发生变化的点加进去,因而解决了这个问题这只是题外话,不用说太多

#include <iostream>
#include <cstdio>
#include <cstring>
#include <queue>
using namespace std;
int u[2010],v[2010],w[2010],next[2010],first[1010];
int d[1010],vis[1010],num[1010];
int n,m,cnt,flag;
void addedge(int a,int b,int c)
{u[cnt]=a;v[cnt]=b;w[cnt]=c;next[cnt]=first[a];first[a]=cnt++;
}
void spfa()
{int i,j;flag=0;for (i=0;i<=n;i++)d[i]=(1<<30);memset(vis,0,sizeof vis);memset(num,0,sizeof num);d[0]=0;queue <int> q;q.push(0);vis[0]=1;while (!q.empty()){int t=q.front();q.pop();vis[t]=0;for (j=first[t];j>=0;j=next[j]){int newnode=v[j];num[newnode]++;if (num[newnode]>n){flag=1;return;}if (d[newnode]>d[t]+w[j]){d[newnode]=d[t]+w[j];//cout<<newnode<<" "<<d[newnode]<<endl;if (!vis[newnode]){q.push(newnode);vis[newnode]=1;}}}}
}
int main()
{int t,i,j;scanf("%d",&t);while (t--){cnt=0;memset(first,-1,sizeof first);scanf("%d%d",&n,&m);int a,b,c;for (i=1;i<=m;i++){scanf("%d%d%d",&a,&b,&c);addedge(a,b,c);}spfa();if (!flag)puts("not possible");elseputs("possible");}return 0;
}

转载于:https://www.cnblogs.com/kkrisen/p/3518192.html

UVA 558 SPFA 判断负环相关推荐

  1. POJ 3259 Wormholes【最短路/SPFA判断负环模板】

    农夫约翰在探索他的许多农场,发现了一些惊人的虫洞.虫洞是很奇特的,因为它是一个单向通道,可让你进入虫洞的前达到目的地!他的N(1≤N≤500)个农场被编号为1..N,之间有M(1≤M≤2500)条路径 ...

  2. spfa 判断负环 (转载)

    当然,对于Spfa判负环,实际上还有优化:就是把判断单个点的入队次数大于n改为:如果总的点入队次数大于所有点两倍 时有负环,或者单个点的入队次数大于sqrt(点数)有负环.这样时间复杂度就降了很多了. ...

  3. 负环——spfa判断负环的两种方式

    第一种:(不推荐) 统计每个点的入队次数,如果某一个点入队了n次,则说明存在负环. 第二种: 统计当前每个点的最短路的边数,如果存在负环,负环上的某一个点的最短路边数一定会是正无穷,只要边数超过n(节 ...

  4. 算法基础课-搜索与图论-spfa-AcWing 852. spfa判断负环:spfa求负环板子

    文章目录 题目分析 题目链接 题目分析 来源:acwing 分析: dist[x] 表示从源点到x点的最短距离. spfa算法求最短路的算法步骤: 初始化一个队列,将起点入队. 取出队头元素t,遍历它 ...

  5. PKU3259-Wormholes(SPFA判断负环,含题意)

    题目: 一开始被题目的梦幻给弄的晕乎乎.的却,作者很会yy. 意思是: 一个农夫有cas个田地,然后每个田地里面有nodeNum个结点,结点之间可能有多条路径(这是一个无向图),田地里还有w个虫洞(虫 ...

  6. spfa判断负环( 负环判定 + spfa )

    给定一个 n 个点 m 条边的有向图,图中可能存在重边和自环, 边权可能为负数. 请你求出 1 号点到 n 号点的最短距离,如果无法从 1 号点走到 n 号点,则输出 impossible. 数据保证 ...

  7. AcWing 852. spfa判断负环(spfa or bellman)

    题目链接 https://www.acwing.com/problem/content/description/854/ 思路 思路一 我们定义一个数组cnt,cnt[i]表示i这个点被更新的次数,那 ...

  8. 时光机 (spfa判断负环)

    cnt数组记录每个点入栈次数,无负环时最大入栈次数为n,因为最短路最多有n-1条边. 有负环时最短路趋于负无穷,入栈次数大于n. #include<stdio.h> #include< ...

  9. Wormholes 虫洞 BZOJ 1715 spfa判断负环

    John在他的农场中闲逛时发现了许多虫洞.虫洞可以看作一条十分奇特的有向边,并可以使你返回到过去的一个时刻(相对你进入虫洞之前).John的每个农场有M条小路(无向边)连接着N (从1..N标号)块地 ...

最新文章

  1. php修改文件访问目录为 .htaccess_借github上韩国师傅的一个源码实例再次理解.htaccess的功效...
  2. 机器学习理论《统计学习方法》学习笔记:第四章 朴素贝叶斯法
  3. 虚拟主机评测网已经崭露头角
  4. python list remove 删除引用_Python——list列表操作一坑(remove)
  5. linux vim自动换行,VIM 的自动换行及自动折行设置
  6. qt 怎么设计个性化的滑块_滑块上走滑块模具结构设计,不一样的结构思维成就你的高薪职业...
  7. java并发常量_Java并发编程-常量对象(七)
  8. 玩转Hook——Android权限管理功能探讨(一)
  9. SlickEdit 之Ubuntu 版本安装
  10. Wechat协议初探
  11. 电吉他效果器音频处理(1)——失真效果器、超载失真效果器、移相效果器、弗兰格效果器
  12. DDoS的攻击方式和防御方法
  13. 2021暑假Leetcode刷题——Two Pointers(1)
  14. 双系统装完只能u盘启动_怎样用u盘安装双系统呢?
  15. python期货基本面分析_Python股票期货交易利器,砖型图详细绘制教程!
  16. 服务器系统 与win7系统,服务器系统win7
  17. Oracle 中的Userenv() 达梦中如何处理?
  18. 什么是PT,PT和BT有什么不同?
  19. 中国大陆开源(Linux)镜像站汇总
  20. 第三章 CSS 选择器的命名

热门文章

  1. linux /etc/passwd
  2. scrapy middlewares.py
  3. pandas.Series.quantile
  4. Linux开机启动程序rc.local
  5. 信息安全完全参考手册之安全设计原则(第四章)
  6. 云服务器 ECS > 安全 > 实例RAM角色 > 概述
  7. 阿里分布式数据库服务实践
  8. Maven学习总结(51)——Maven 常用属性和常量说明
  9. 50道编程小题目之【兔子数量】
  10. Wget 命令用法详解