首页 > 编程语言 >差分约束算法

差分约束算法

时间:2024-02-08 16:33:42浏览次数:26  
标签:ch 不等式 int 差分 约束 leq 算法 顶点

一、题目描述

P5960 【模板】差分约束


二、题目简析

差分约束问题的典型特征是一组不等式。只要画出约束图,这类问题都可以准换为最短路径问题。注意:约束图是有向图

2.1 约束图的顶点

约束图的顶点(\(V\)) = 一个未知数对应一个顶点(\(v_1, v_2, ...,v_n\)) + 一个额外的顶点(\(v_0\))

2.2 约束图的边

约束图的边由两部分组成:

  • 1、从 \(v_0\) 到各顶点的有向边
    有 \(n\) 个顶点,就有 \(n\) 条这样的有向边。同时,这些边的权值为 0。
  • 2、由不等式组得到的有向边
    有 \(m\) 个不等式,就有 \(m\) 条这样的有向边。以 \(v_1 - v_2 \leq y_1\) 为例,变形为 \(v_1 \leq v_2 + y_1\),有向边为 \(e(v_2, v_1)\),权值为 \(e(v_2, v_1).w = y_1\)。可以总结以下规则:先对不等式变形,使两个顶点位于不等式符号的两侧(顶点前为正符号);然后,不等式符号开口朝向的顶点为起点,尖端朝向的顶点为终点,权值为开口朝向的那个常数(可正可负)。

举例:
原不等式组:

\[\begin{cases} x_1 - x_2 \leq 3 \\ x_2 - x_3 \leq -2 \\ x_1 - x_3 \leq 1 \end{cases} \]

引入额外顶点 \(v_0\),并画权值为0的有向边:

图1

变形:

\[\begin{cases} x_1 \leq x_2 + 3 \\ x_2 \leq x_3 -2 \\ x_1 \leq x_3 + 1 \end{cases} \]

得到最终约束图:

图2

2.3 由约束图求不等式组的解

上文提到,差分约束问题可以用最短路径求解,所以,我们也用一个数组 d[] 记录最短路径。我们令 \(v_0\) 为起点,并初始化为 0。这里,就是 \(d[0] = 0\)。接着,用最短路径算法求 \(v_0\) 到各点的最短路径。各点的最短路径就是不等式组的一个解,即 \(x = (x_1, x_2, ..., x_n) = (d[1], d[2], ..., d[n])\)。
有两点需要注意:

  • 1、因为边的权值可能为负,所以只能采用 \(Bellman-Ford\)。若返回 \(ture\),说明存在负环,所以无解;若返回 \(false\),说明不存在负环,则有解。
  • 2、我们求出的只是不等式组的一个解,有以下性质:
    若 \(x = (x_1, x_2, ..., x_n)\) 是不等式组的解,\(a \in \mathbb{R}\),则 \(x + a = (x_1 + a, x_2 + a, ..., x_n + a)\) 也是不等式组的解。

三、本题代码

#include <bits/stdc++.h>

using namespace std;

#define MAX 5003
#define INF 1e8

typedef struct
{
	int from, to, worth;
} edge;

int n, m;
vector<edge> E;
int d[MAX];

int quickin(void)
{
	int ret = 0;
	bool flag = false;
	char ch = getchar();
	while (ch < '0' || ch > '9')
	{
		if (ch == '-')
			flag = true;
		ch = getchar();
	}
	while (ch >= '0' && ch <= '9')
	{
		ret = 10 * ret + ch - '0';
		ch = getchar();
	}
	if (flag)
		ret = -ret;
	return ret;
}

// Bellman-Ford
bool solve(void)
{
	fill(begin(d), end(d), INF);
	d[0] = 0;

	for (int i = 0; i < n; i++)
	{
		bool flag = false;
		for (int j = 0; j < E.size(); j++)
		{
			edge e = E[j];
			if (d[e.from] != INF && d[e.to] > d[e.from] + e.worth)
			{
				d[e.to] = d[e.from] + e.worth;
				flag = true;
				if (i == n - 1)
					return true;	// 存在负环
			}
		}
		if (!flag)
			break;
	}

	return false;
}

int main()
{
	n = quickin(), m = quickin();
	for (int i = 0; i < m; i++)
	{
		int a, b, c;
		a = quickin(), b = quickin(), c = quickin();
		E.push_back(edge{b, a, c});
	}
	// 添加额外点
	for (int i = 1; i <= n; i++)
		E.push_back(edge{0, i, 0});

	if (solve())
		puts("NO");
	else
		for (int i = 1; i <= n; i++)
			printf("%d ", d[i]);

	return 0;
}

标签:ch,不等式,int,差分,约束,leq,算法,顶点
From: https://www.cnblogs.com/hoyd/p/18011912

相关文章

  • 2024牛客寒假算法基础集训营3
    2024牛客寒假算法基础集训营3A.智乃与瞩目狸猫、幸运水母、月宫龙虾思路:就是一个简单的字符串#include<bits/stdc++.h>usingnamespacestd;voidsolve(){stringa,b;cin>>a>>b;if(a[0]==b[0]||a[0]-'A'+'a'==b[0]||b[0]-'A'+'a'==......
  • 代码随想录算法训练营第十五天| 层序遍历 10 226.翻转二叉树 101.对称二叉树 2
    层序遍历  102.二叉树的层序遍历-力扣(LeetCode)思路:结合了昨天学到的标记法,每当一层遍历完,向队列中添加一个NULL标记。遍历到NULL节点表示该层遍历完了,将结果存入结果集中。/***Definitionforabinarytreenode.*structTreeNode{*intval;*TreeNo......
  • 【教3妹学编程-算法题】3028. 边界上的蚂蚁
    3妹:2哥,今天春节回的去吗?最火春运遭遇最强暴雪:冻雨像刨冰2哥:听说湖北的高速、高铁都已经停了。3妹:是啊,如果是雪还好办,可以除雪,冻雨就比较难办了。2哥:哎,好多人都滞留的高铁站了,没法回家了3妹:也有好多人滞留在高速上面,急的像热锅上的蚂蚁,惨。2哥:3妹,要不别回去了吧,我们就地过......
  • R语言用随机森林模型的酒店收入和产量预测误差分析
    全文链接:https://tecdat.cn/?p=35162在这篇文章中,我们将探讨基于随机森林模型的酒店收入和产量预测分析。我们将使用4月9日至4月15日的数据作为测试集,评估预测的准确度。我们将分别对单个酒店在三个预订渠道的总收入和总产量进行分析,并使用随机森林模型进行预测。通过对比每家酒......
  • TCP拥塞控制算法初步介绍
    TCP拥塞控制算法初步介绍写得较为浅显,若有错误的地方还请指正.一、TCP拥塞控制:让发送方自己感知网络的拥塞程度并限制其能向链接发送流量的速率.限制方法:设置LastByteSent-LastByteAcked<=min{cwnd,rwnd}即已发送而未被确认的流量小于等于两个窗口长其中,cwnd......
  • SSL证书使用了弱Hash算法漏洞修复
    首先确认端口号,如果为3389端口,那就是远程桌面服务中的算法有弱Hash算法。在Windows中打开计算机配置-管理模板-Windows组件-网络-SSL配置设置查看配置中是否存在包含MD2、MD3、MD4、MD5、SHA-1等算法,如果有就删掉。将配置算法粘贴到一个文本文件中修改时注意官方的修改方......
  • 【国产化】禁止使用不安全的密码算法:DES、RC2,RSA(1024位及以下),MD5,SHA1
    一、引言随着互联网的普及和技术的发展,网络安全问题日益严重。密码算法作为网络安全的基石,其安全性直接关系到用户数据的安全。一些不安全的密码算法不断被曝光,给用户带来了极大的安全隐患。二、不安全的密码算法1.DESDES(DataEncryptionStandard)是一种对称加密算法,自1977年......
  • PowerShell 的 Get-FileHash 命令查询一个文件的所有上述哈希值(假设是 SHA256, MD5, S
    PowerShell是一种跨平台的任务自动化解决方案,包含一个命令行外壳、脚本语言和配置管理框架。PowerShell提供了用于计算文件哈希值的内置命令Get-FileHash。Get-FileHash命令可以用来计算文件的哈希值,支持多种哈希算法。,Get-FileHash支持以下几种哈希算法:SHA256:默认算法,提......
  • 2024牛客寒假算法基础集训营1个人补题题解(I)
    比赛链接:2024牛客寒假算法基础集训营1I、It'sbertrandparadox.Again!这么抽象的东西出得很好,下次别再出了。从bit和buaa不同的抽数规则可以得出一个结论:bit抽取具体坐标点的次数会明显小于buaa,甚至只有在几乎不可能的理想范围内两者抽取的次数才相近,因此因为样本量极大(1e5次......
  • 代码随想录算法训练营第十四天| 理论基础 递归遍历 迭代遍历 统一迭代
    理论基础代码随想录(programmercarl.com)二叉树的链接形式定义(防忘)structTreeNode{intval;TreeNode*left;TreeNode*right;TreeNode(intx):val(x),left(NULL),right(NULL){}};额外补充(关于unordered_map和map)unordered_map和map类似,都是存储......