首页 > 其他分享 >【图论】【模板】差分约束系统

【图论】【模板】差分约束系统

时间:2024-07-22 09:19:29浏览次数:6  
标签:图论 le idx int 差分 aligned 模板 dis

差分约束系统

差分约束系统是将不等式组的问题转化为图论问题。

前置知识

判断负环

例题

P5960 【模板】差分约束算法

思路

我们将 \(x_u - x_v \le y_u\) 换为 \(x_u \le x_v + y_u\)。

然后我们建立一条连接 \(v, u\)(注意是 \(v, u\) 不是 \(u, v\))权值为 \(y_u\) 的边。

我们发现从根节点到节点 \(u\) 的最短路径长度 \(dis_u\) 就是对 \(x_u\) 上限的限制。

比如这个图:

实际上这个图描述的就是关系:

\[\begin{aligned} x_2 - x_1 \le 1\\ x_3 - x_2 \le 2\\ x_1 - x_3 \le 5 \end{aligned} \]

我们以 \(1\) 为源点的最短路为

\[\begin{aligned} dis_1 = 0\\ dis_2 = 1\\ dis_3 = 3 \end{aligned} \]

那么就有

\[\begin{aligned} x_2 \le x_1 + dis_2\\ x_3 \le x_1 + dis_3 \end{aligned} \]

\[\begin{aligned} x_2 \le x_1 + 1\\ x_3 \le x_1 + 3 \end{aligned} \]

如果有负环,那么从 \(1\) 号点走,回到 \(1\) 号点,就会出现 \(x_1 \le x_1 + w, w < 0\) 的场面,显然是矛盾的,所以如果出现负环,那么无解。

怎么用 SPFA 判断负环:参见我的博客

然后为了使图联通,我们建立一个超级源点 \(S\) 连向每一个点且权值为 \(0\) 的边。

代码

/*******************************
| Author:  SunnyYuan
| Problem: P5960 【模板】差分约束算法
| Contest: Luogu
| URL:     https://www.luogu.com.cn/problem/P5960
| When:    2023-09-18 09:13:00
| 
| Memory:  128 MB
| Time:    1000 ms
*******************************/

#include <bits/stdc++.h>

using namespace std;

const int N = 5010, 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 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();
        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 + 1) return false;
                if (!st[to]) {
                    st[to] = true;
                    q.push(to);
                }
            }
        }
    }
    return true;
}

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    cin >> n >> m;
    int u, v, w;
    for (int i = 1; i <= n; i++) add(0, i, 0);
    for (int i = 1; i <= m; i++) {
        cin >> u >> v >> w;
        // Xu - Xv <= w
        // Xu <= Xv + w
        add(v, u, w);
    }
    if (spfa(0)) for (int i = 1; i <= n; i++) cout << dis[i] << ' ';
    else cout << "NO\n";
    return 0;
}

例题

My Blog:P1993 小 K 的农场题解

My Blog:P4926 [1007] 倍杀测量者题解

My Blog:P7515 [省选联考 2021 A 卷] 矩阵游戏题解

标签:图论,le,idx,int,差分,aligned,模板,dis
From: https://www.cnblogs.com/Yuan-Jiawei/p/18315364

相关文章

  • 【图论】【模板】最长路、最短路
    最短路Dijkstra算法思路Dijkstra算法,采用贪心思想,在某一时刻如果\(dis\)数组中\(dis_u\)最小,那么就固定\(u\),\(dis_u\)一定是\(1\rightarrowu\)的最短路径,然后我们再通过\(u\)更新与\(u\)有边相连的\(v\),如果\(dis_v>dis_u+w\),那么\(dis_v=dis_u+w\)......
  • 【图论】【模板】判断负环
    使用SPFA算法判断负环前言判断负环是属于判定性的问题,常与二分结合起来。例题AcWing852.spfa判断负环思路可以使用SPFA进行判断。因为两点之间至多有\(n-1\)条边,所以当一个点的最短路径经过的边数大于等于\(n\)时,说明有负环。代码#include<bits/stdc++.h>......
  • 【搜索】【模板】模拟退火
    前置知识自然对数、分数次幂、概率。前言模拟退火可以在我们想不到题目正解的时候试一试其实就是骗分方法。因为纯随机得出正确答案的概率非常低,所以我们就可以加一定的优化,使找到答案概率增大。算法思想温度(步长):每次选择一个范围进行搜索,在搜索过程中范围不断缩小,最后到很......
  • 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......