首页 > 其他分享 >用SPFA判断负权图

用SPFA判断负权图

时间:2023-05-17 09:33:10浏览次数:41  
标签:cnt 判断 cout idx int st SPFA 负权 节点

#include <bits/stdc++.h>
using namespace std;
const int N = 100010, M = 200010, INF = 0x3f3f3f3f;
#define ll long long
int e[N], ne[N], h[N], w[N], d[N], cnt[N], idx = 1;
int n, m;
bool st[N]; // 记录是否在队列里
void add (int a, int b, int c) {
  e[idx] = b, w[idx] = c, ne[idx] = h[a], h[a] = idx ++;
}
bool spfa() {

/*关于为什么用SPFA判断负权图时不用初始化d数组到无穷大的理解:

1. 构造一个虚拟节点 O,单向指向所有的节点,且到所有节点距离为0;(也就是超级源点, 之前也做过一道用超级源点的图论题,,,在哪来着。。。。)
2. 新图是否有负环等价于原始的图。
3.dist数组一开始为0,没有违背算法过程,可以理解为根据算法已经从O 更新到了各个节点,接下来的代码就是顺理成章。所以dist数组从所有为0的状态开始是有对应意义的。就是先走一步。
*/
  queue <int> q;
  for (int i = 1; i <= n; ++ i) q.push(i), st[i] = 1;
  while (!q.empty()) {
    int t = q.front(); q.pop();
    st[t] = 0;
    for (int i = h[t]; i; i = ne[i]) {
      int j = e[i];
      if (d[j] > d[t] + w[i]) {
        d[j] = d[t] + w[i];
        cnt[j] = cnt[t] + 1;
        if (cnt[j] >= n) return 1;
        if (!st[j]) {
          q.push(j);
          st[j] = 1;
        }
      }
    }
  }
  return 0;
}
int main(){
  ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
  cin >> n >> m;
  while (m -- ) {
    int a, b, c;
    cin >> a >> b >> c;
    add(a, b, c);
  }
  int ans = spfa();
  if (spfa()) cout << "Yes";
  else cout << "No";
  return 0;
}

标签:cnt,判断,cout,idx,int,st,SPFA,负权,节点
From: https://www.cnblogs.com/W-qwq/p/17407561.html

相关文章

  • 通过两期比重判断增长率
    两期比重公式为:A/B·a-b/1+a--->若a>b则比重↑如题:数据:A:B:D:以上计算都很常规,运用r=增长量/现-增长量直接速算即可。C:本逻辑务必学会!......
  • 5.2 从键盘任意输入一个整数,编程判断它的奇偶性。
    设计思路:了解奇数和偶数的性质后,运用合适的运算符和判断语句设计程序代码:#include<stdio.h>intmain(){inta;scanf("%d",&a);if(a%2==0)printf("%d为偶数",a);elseprintf("%d为奇数");return0;}总结:C除余语言运算符的运用......
  • 17 16届智能车十六届国二代码源程序,基础四轮摄像头循迹识别判断。
    1716届智能车十六届国二代码源程序,基础四轮摄像头循迹识别判断。逐飞tc264龙邱tc264都有能过十字直角三岔路环岛元素均能识别,功能全部能实现打包出的龙邱逐飞都有,代码移植行好,有基础的小伙伴可以参考学习,不用问我带不带指导,压缩包里有视频讲解。本代码只供参考学习使用—————......
  • 判断 101-200 之间有多少个素数,并输出所有素数。
    判断101-200之间有多少个素数,并输出所有素数。#如果一个数N不是素数,对于从2到(N-1)的所有数,N依次除以2到(N-1)的所有数,一定会出现余数≠0#取出101-200之间的所有素数,放到一个列表中,可以计算出素数的个数并输出所有素数primenum_list=[]fornumberinrange(101,201):......
  • 输入某年某月某日,判断这一天是这一年的第几天?
    分析:(1)分别输入年、月、日,且规定输入的数字为整型(2)判断年份,是平年还是闰年,如果是平年,2月就有28天;如果是闰年,2月就有29天(3)闰年:分为普通闰年和世纪闰年普通闰年:公历年份是4的倍数,且不是100的倍数的,为闰年(如2004年、2020年等就是闰年)。世纪闰年:公历年份是整百数的,必须是400的倍数......
  • js判断PC端访问还是移动端访问
    varuserAgent=navigator.userAgent.toLowerCase();if((userAgent.match(/(phone|pad|pod|iphone|ipod|ios|ipad|android|mobile|blackberry|iemobile|mqqbrowser|juc|fennec|wosbrowser|browserng|webos|symbian|windowsphone|windowsmobile|windowsce|ucweb|rv:1.2.3.......
  • JQuery判断当前网址是否为指定网址,防止盗链JS
    if(location.toString().indexOf("xxxx.com")<=-1){alert("非法访问,返回主站!");setTimeout(function(){self.location.href="https://www.xxxx.com/";},5000);}释义:判断当前打开网址是不是指定网址,不是就返回到指定网址。最后我们把这段代码和自己写的代码一起打包加......
  • 【转】Linux下判断cpu架构及系统发行版方法
    原文地址:https://zhuanlan.zhihu.com/p/374738476一、判断cpu架构1,使用命令:hostnamectl2,使用命令:arch3,使用lscpu4,使用命令:cat/proc/cpuinfo,可以查到具体指令集二、判断系统是Debian系还是Redhat系大家都知道linux分redhat系和debian系,那么肯定有办法,去判断系统是r......
  • 判断奇偶
    题目描述:输入一个整数,打印出它是奇数(odd)还是偶数(even)输入格式:一个数输出格式:输出odd或even样例输入:7样例输出:odd提示:if关系表达式:    #关系表达式的值为真执行语句1,否则执行语句2,  语句1   else:  语句2......
  • js计算一个矩形内部,有一个等比缩放的矩形,如何判断宽和高那个先溢出外层的矩形
    最近在做jscanvas绘图需求时,遇到一个矩形图形重叠逻辑判断问题。一个任意矩形内部,有一个任意等比缩放的矩形,如何判断宽和高那个先溢出外层的矩形?宽和高那个先贴到边上?可以根据两个矩形的比例关系来判断宽和高那个先溢出。首先计算出两个矩形的宽高比,然后比较它们的大小关系。......