【图论】差分约束

这篇具有很好参考价值的文章主要介绍了【图论】差分约束。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一.情景导入

x1-x0<=9 ; x2-x0<=14 ; x3-x0<=15 ; x2-x1<=10 ; x3-x2<=9;

求x3-x0的最大值;


二.数学解法

联立式子2和5,可得x3-x0<=23;但式子3可得x3-x0<=15。所以最大值为15;


三.图论

但式子多了我们就不好解了,或者说在计算机中怎么解呢?

我们可以想到,不妨把式子转为图的形式。我们令x0-->x1的边表示为x1-x0<=边权值。

则以上式子可以画图为:

【图论】差分约束,图论,图论,算法,c++

这边,x3-x0可以为:(即x3-x0<=15)

【图论】差分约束,图论,图论,算法,c++

也可以为:(即x3-x0<=28)

【图论】差分约束,图论,图论,算法,c++

还可以为 :(即x3-x0<=25)

【图论】差分约束,图论,图论,算法,c++

所以我们取最短路径即可! 


四.差分约束

这个即是差分约束的模型

【图论】差分约束,图论,图论,算法,c++

【图论】差分约束,图论,图论,算法,c++

注意:

当出现负环的情况,我们可知,式子是无解的!(所以要用spfa算法判断负环)

当要求的两个点没有联通时,可知这两个式子没有约束!所有解都有可能!


五.例题:

3169 -- 布局 (poj.org)

 【图论】差分约束,图论,图论,算法,c++

样例输入:

4 2 1
1 3 10
2 4 20
2 3 3

样例输出:

27

 文章来源地址https://www.toymoban.com/news/detail-635765.html


六.参考代码 

/*
4 2 1
1 3 10
2 4 20
2 3 3

27
*/

#include<bits/stdc++.h>
#define maxn 20005
#define maxm 1001
#define inf 0x7fffffff
using namespace std;
int cnt=0;
struct Edge{
	int u,v,w,next;
}edge[maxn];
int head[maxm];
void add(int u,int v,int w){
	edge[++cnt]=(Edge){u,v,w,head[u]}; head[u]=cnt;
}
int n,x,y;
bool vis[maxm];
int in[maxm],dis[maxn];  //判断负环
//基础,不会的话看我以前的博客 
int spfa(int x){
	queue<int> q;
	for(int i=1;i<=n;i++){
		dis[i]=inf;
	}
	dis[x]=0;
	in[x]++;
	q.push(x);
	while(!q.empty()){
		int u=q.front(); q.pop();
		vis[u]=0;
		for(int i=head[u];i;i=edge[i].next){
			int v=edge[i].v,w=edge[i].w;
			if(dis[u]+w<dis[v]){
				dis[v]=dis[u]+w;
				if(!vis[v]){
					vis[v]=1;
					q.push(v);
					in[v]++;
					if(in[v]>n) return -1; //负环 
				}
			}
		} 
	}
	if(dis[n]==inf) return -2;  //无限制
	return dis[n]; 
} 
int main(){
	cin>>n>>x>>y;
	int u,v,w;
	for(int i=1;i<=x;i++){
		scanf("%d%d%d",&u,&v,&w);
		add(u,v,w);
	}
	for(int i=1;i<=y;i++){
		scanf("%d%d%d",&u,&v,&w);
		add(v,u,-w);
	}
	//是站成一条直线 
	for(int i=1;i<n;i++){
		add(i+1,i,-1);
	}
	cout<<spfa(1); 
	return 0;
}

到了这里,关于【图论】差分约束的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • SPFA之差分约束

    求不等式的可行解 求 最大 值与 最小 值 (重点) 步骤: 将每个不等式 x i ≤ x j + c k x_ile x_j + c_k x i ​ ≤ x j ​ + c k ​ ,转化为一条从 x j x_j x j ​ 到 x i x_i x i ​ 的一条长度为 c k c_k c k ​ 的边 找到一个超级源点,使得该源点一定可以遍历到所有边 从源点求一遍单源最短

    2024年02月13日
    浏览(35)
  • 草图几何约束——图论法(一)

    在几何约束问题中,基于图论求解图元约束状态的方法。其基本思想是将几何约束问题表示成几何约束图。通过约束图中顶点与顶点通过边连接的关系来定义几何图形的状态。这种方法可以更好的处理完全约束与过约束问题。 以下内容中部分术语可能在不同的文献里面有不同

    2024年02月04日
    浏览(50)
  • 【差分数组】【图论】【分类讨论】【整除以2】100213按距离统计房屋对数目

    【动态规划】【数学】【C++算法】18赛车 差分数组 图论 分类讨论 整除以2 给你三个 正整数 n 、x 和 y 。 在城市中,存在编号从 1 到 n 的房屋,由 n 条街道相连。对所有 1 = i n ,都存在一条街道连接编号为 i 的房屋与编号为 i + 1 的房屋。另存在一条街道连接编号为 x 的房屋与

    2024年01月22日
    浏览(37)
  • 二维差分算法详解

    二维差分模板 给定一个n行m列的矩阵,下标从1开始。接下来有q次操作,每次操作输入5个参数x1, y1, x2, y2, k,表示把以(x1, y1)为左上角,(x2,y2)为右下角的子矩阵的每个元素都加上k。请输出操作后的矩阵。 第一行包含三个整数n,m,q。接下来n行,每行m个整数,代表矩阵的元素。接

    2024年01月20日
    浏览(44)
  • 蓝桥杯一维差分 | 算法基础

    ⭐ 简单说两句 ⭐ ✨ 正在努力的小新~ 💖 超级爱分享,分享各种有趣干货! 👩‍💻 提供:模拟面试 | 简历诊断 | 独家简历模板 🌈 感谢关注,关注了你就是我的超级粉丝啦! 🔒 以下内容仅对你可见~ 作者: 后端小知识 , CSDN后端领域新星创作者 |阿里云专家博主 CSDN 个

    2024年02月03日
    浏览(43)
  • 差分算法及模板详解

    ⭐写在前面的话:本系列文章旨在复习算法刷题中常用的基础算法与数据结构,配以详细的图例解释,总结相应的代码模板,同时结合例题以达到最佳的学习效果。本专栏面向算法零基础但有一定的C++基础的学习者。若C++基础不牢固,可参考:10min快速回顾C++语法,进行语法

    2023年04月09日
    浏览(53)
  • 差分算法介绍

    一、一维差分基本概念 差分算法是前缀和算法的逆运算,可以快速的对数组的某一区间进行计算操作。 例如,有一数列 a[1],a[2],.…a[n],且令 b[i] = a[i]-a[i-1],b[1]=a[1],那么就有 a[i] = b[1]+b[2]+.…+b[i] = a[1]+a[2]-a[1]+a[3]-a[2]+.…+a[i]-a[i-1],此时b数组称作a数组的差分数组 ,换句话来说

    2024年01月25日
    浏览(73)
  • 算法专题:差分数组

    2024年01月18日
    浏览(33)
  • 算法之路-------差分数组

    针对数组中连续的大量数据进行修改的问题,如果我们对每个数据都进行依次修改,对于一些少量的数据的修改(例如:1~100这些的),修改的时候我们发现速度貌似还是很快的,但是一旦修改的连续数组中的数量上万了,那么修改的速率就明显下降了。 所以:针对这样的情

    2024年02月06日
    浏览(50)
  • 前缀和&差分算法(Python版)

    前缀和与差分是常用的区间优化方式,其中前缀和数组可以将区间查询的时间复杂度降为常数,而差分数组则可以将区间修改的时间复杂度降为常数。 前缀和知识点简单易理解,但出题难度较大,需要根据题意挖掘出潜在的前缀和关系,建立辅助数组求解问题。 (1)一维前

    2024年04月17日
    浏览(54)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包