首页 > 其他分享 >【图论】【模板】判断负环

【图论】【模板】判断负环

时间:2024-07-22 09:18:50浏览次数:17  
标签:图论 idx int cnt st 负环 模板 dis

使用 SPFA 算法判断负环

前言

判断负环是属于判定性的问题,常与二分结合起来。

例题

AcWing 852. spfa判断负环

思路

可以使用 SPFA 进行判断。

因为两点之间至多有 \(n - 1\) 条边,所以当一个点的最短路径经过的边数大于等于 \(n\) 时,说明有负环。

代码

#include <bits/stdc++.h>

using namespace std;

const int N = 2010, M = 10010;

struct edge {
    int to, next, w;
} e[M];

int head[N], idx;

void add(int u, int v, int w) {
    idx++, e[idx].to = v, e[idx].next = head[u], e[idx].w = w, head[u] = idx;
}

int n, m;
int dis[N];
int cnt[N];
bool st[N];
bool vis[N];

bool spfa(int u) {
    memset(dis, 0x3f, sizeof(dis));
    dis[u] = 0;
    queue<int> q;
    q.push(u);
    st[u] = true;
    
    while (q.size()) {
        int t = q.front();
        vis[t] = true;
        q.pop();
        st[t] = false;
        
        for (int i = head[t]; i; i = e[i].next) {
            int to = e[i].to;
            if (dis[to] > dis[t] + e[i].w) {
                dis[to] = dis[t] + e[i].w;
                cnt[to] = cnt[t] + 1;
                if (cnt[to] >= n) return true;
                if (!st[to]) {
                    q.push(to);
                    st[to] = true;
                }
            }
        }
    }
    return false;
}

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    
    cin >> n >> m;
    int u, v, w;
    for (int i = 1; i <= m; i++) {
        cin >> u >> v >> w;
        add(u, v, w);
    }
    for (int i = 1; i <= n; i++) {
        if (!vis[i]) {
            if (spfa(i)) {
                cout << "Yes\n";
                return 0;
            }
        }
    }
    cout << "No\n";
    return 0;
}

标签:图论,idx,int,cnt,st,负环,模板,dis
From: https://www.cnblogs.com/Yuan-Jiawei/p/18315365

相关文章

  • 【搜索】【模板】模拟退火
    前置知识自然对数、分数次幂、概率。前言模拟退火可以在我们想不到题目正解的时候试一试其实就是骗分方法。因为纯随机得出正确答案的概率非常低,所以我们就可以加一定的优化,使找到答案概率增大。算法思想温度(步长):每次选择一个范围进行搜索,在搜索过程中范围不断缩小,最后到很......
  • C++标准模板(STL)- 概念库 (C++20) - 指定一个类型派生自另一类型 - (std::derived_from)
    概念库提供基础语言概念的定义,它们能用于进行模板实参的编译时校验,以及基于类型属性的函数派发。这些概念在程序中提供等式推理的基础。标准库中的大多数概念一同加上了语法及语义要求。通常,编译器只能检查语法要求。若在使用点语义要求未得到满足,则程序为病式,不要求诊断。......
  • 爱思唯尔模板 LATEX 表格标题左对齐
    爱思唯尔模板LATEX表格标题左对齐1.问题描述2.解决方法1.问题描述若出现表格标题如下居中形式,想要变成左对齐的形式。2.解决方法在\begin{document}前面加上\usepackage[font=small,labelfont=bf,labelsep=none]{caption}\captionsetup[table]{labelforma......
  • 基于 T4 模板生成代码
    Asp.NetCore系列:基于T4模板生成代码  目录简介组成部分分类VisualStudio中使用T4模板1.创建T4模板文件2.编写T4模板3.转换模板中心控制Manager根据MySQL数据库生成实体 简介T4模板,即TextTemplateTransformationToolkit,是微软官方在Visua......
  • 算法 图论最短路径
    零、写在前面本文讲述Dijkstra、Bellman-Ford、Floyd-Warshall算法一、分类G(graph):图V(vertex):点E(edge):边一个图可以用数学语言描述为。W(weights):权所以一个图也可以用数学语言描述为。二、作图2.1作图网站(推荐) 在线作图网站:图论作图网站GraphEditor用法:Undirected......
  • 高精度模板
    高精度模板structBigNum{intval[N],len=1;voidinit(){val[1]=len=1;}BigNumoperator+(constBigNum&x)const{staticBigNumt=*this;t.len=max(t.len,x.len);for(inti=1;i<=t.len;i++)t.val[......
  • 易优CMS模板标签load文件加载导入外部的css样式文件
    【基础用法】标签:load描述:资源文件加载,比如:css/js用法:{eyou:loadhref='/static/js/common.js'ver='on'/}属性:file=''资源文件路径href=''远程资源文件URLver=''开启版本号自动刷新浏览器缓存涉及表字段:无【更多示例】-------------------------------示例1------......
  • 易优CMS模板标签global全局变量输出网站关键词
    【基础用法】标签:global描述:获取系统全局配置变量内容用法:{eyou:globalname='web_title'/}或者{$eyou.global.web_title}文件:系统模板引擎属性:name=''变量名涉及表字段:请查阅网站后台的【设置】-【基本信息】web_status关闭网站web_name网站名称web_logo网站LOGO......
  • 帝国CMS网站增加手机WAP模板步骤说明
    一、增加WAP模板步骤说明:1、先制作好WAP模板文件(/e/wap/template/);2、登录后台管理WAP模板里增加刚才做好的WAP模板目录;3、WAP设置里选择新WAP模板测试;4、完成。二、WAP设置:1、登录后台,单击“栏目”菜单,选择“WAP设置”子菜单,进入WAP设置界面:2、进入WAP设置界面:开启WAP ......
  • 微信小程序--7(WXSS模板样式)
    目录一、概念二、扩展特性     (一)rpx尺寸单位(二)@import样式导入三、全局样式与局部样式(一)全局样式(二)局部样式一、概念        WXSS是一套样式语言,用来美化WXML的组件样式,类似网页开发中的CSS。二、扩展特性             与CSS相......