差分约束学习笔记

本文介绍了如何使用最短路径算法(SPFA)解决带有约束条件的变量问题,通过将不等式转化为图论中的边权重,利用超级源点和负环检测来判断是否存在满足条件的解。实例以洛谷小K农场问题为例,展示了代码实现和逻辑分析。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1有n个未知数,其中有m个约束条件,形如x1-x2<=c之类的,问是否存在满足所有约束条件的情况。

2对于条件x1-x2<=c,可以转换成x1<=c+x2,此时可以建一个x2连向x1边权为c的边,因为这个公式和最短路中的松弛操作很像。假设有两个式子,x1<=c+x2和x1<=c+x3,分别建一条x2到x1和x3到x1的边权为c的边,为了满足条件,x1肯定越小越好,如果x1出度为0,那么x1怎么小都没影响,而x1有指向其他点的边,那么x1尽量要大一点,最短路求出的就是其最大值。

3创造一个超级源点,连接所有的点,边权为0,跑spfa判断是否有负环,如果有负环,说明不满足约束条件

代码实现:

根据模板题:小 K 的农场 - 洛谷

1数据存储:

const int maxn=1e4+10;
const int inf=0x3f3f3f3f;
int n,m;
struct edge{
	int to,w;
};
vector<edge>vv[maxn];
void add(int u,int v,int w)
{
	vv[u].push_back({v,w});
}
bool in[maxn];//标记是否入队列 
int cnt[maxn];//spfa记录到达该点经过的路径 
int dis[maxn];//最短路 

2spfa判断负环

bool spfa(int s)
{
	for(int i=1;i<=n;i++)
	dis[i]=inf;
	dis[s]=0;
	queue<int>q;
	q.push(s);
	in[s]=1;
	while(!q.empty())
	{
		int u=q.front();
		q.pop();
		in[u]=0;
		for(int i=0;i<vv[u].size();i++)
		{
			int to=vv[u][i].to;
			int w=vv[u][i].w;
			if(dis[to]>dis[u]+w)
			{
				dis[to]=dis[u]+w;
				cnt[to]=cnt[u]+1;
				if(cnt[to]>=n+1)
				return 0;
				if(!in[to])
				{
					q.push(to);
					in[to]=1;
				}
			}
		}
	}
	return 1;
}

3主函数(建边)

int main()
{	
	cin>>n>>m;
	for(int i=1;i<=m;i++)
	{
		int op,u,v,c;
		cin>>op;
		if(op==1)//u-c>=v   建一条u到v边权为-c的边 
		{
		cin>>u>>v>>c;
		add(u,v,-c);	
		}
		else if(op==2)//u<=v+c   建一条v到u权为c的边 
		{
			cin>>u>>v>>c;
			add(v,u,c);
		}
		else//u<=v+0  u+0>=v    分别建一条u到v和v到u边权都为0的边 
		{
			cin>>u>>v;
			add(u,v,0);
			add(v,u,0);
		}
	}
	for(int i=1;i<=n;i++)
	add(0,i,0);
	if(spfa(0))
	cout<<"Yes\n";
	else
	cout<<"No\n";
	return 0;
}

4完整代码

#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int maxn=1e4+10;
const int inf=0x3f3f3f3f;
int n,m;
struct edge{
	int to,w;
};
vector<edge>vv[maxn];
void add(int u,int v,int w)
{
	vv[u].push_back({v,w});
}
bool in[maxn];//标记是否入队列 
int cnt[maxn];//spfa记录到达该点经过的路径 
int dis[maxn];//最短路 
bool spfa(int s)
{
	for(int i=1;i<=n;i++)
	dis[i]=inf;
	dis[s]=0;
	queue<int>q;
	q.push(s);
	in[s]=1;
	while(!q.empty())
	{
		int u=q.front();
		q.pop();
		in[u]=0;
		for(int i=0;i<vv[u].size();i++)
		{
			int to=vv[u][i].to;
			int w=vv[u][i].w;
			if(dis[to]>dis[u]+w)
			{
				dis[to]=dis[u]+w;
				cnt[to]=cnt[u]+1;
				if(cnt[to]>=n+1)
				return 0;
				if(!in[to])
				{
					q.push(to);
					in[to]=1;
				}
			}
		}
	}
	return 1;
}
int main()
{	
	cin>>n>>m;
	for(int i=1;i<=m;i++)
	{
		int op,u,v,c;
		cin>>op;
		if(op==1)//u-c>=v   建一条u到v边权为-c的边 
		{
		cin>>u>>v>>c;
		add(u,v,-c);	
		}
		else if(op==2)//u<=v+c   建一条v到u权为c的边 
		{
			cin>>u>>v>>c;
			add(v,u,c);
		}
		else//u<=v+0  u+0>=v    分别建一条u到v和v到u边权都为0的边 
		{
			cin>>u>>v;
			add(u,v,0);
			add(v,u,0);
		}
	}
	for(int i=1;i<=n;i++)
	add(0,i,0);
	if(spfa(0))
	cout<<"Yes\n";
	else
	cout<<"No\n";
	return 0;
}

yolov8n网络模型结构如下所示: 1. 输入层:接收图像作为输入。 2. Darknet-53层:一个由53个卷积层和残差连接组成的主干网络,用于提取图像特征。 3. Neck层:由SPP(Spatial Pyramid Pooling)和PAN(Path Aggregation Network)模块组成,用于融合多尺度特征。 4. Detection层:包括3个不同大小的特征金字塔层,每个层都与3个不同大小的锚点框相关联,用于预测目标的边界框和类别。 5. 输出层:输出预测的目标边界框和类别。 总结起来,yolov8n网络模型结构由输入层、Darknet-53层、Neck层、Detection层和输出层组成,通过多层网络结构实现目标检测。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [YOLOV8-网络结构](https://blog.youkuaiyun.com/weixin_40723264/article/details/130745025)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* *3* [YOLOv8详解 【网络结构+代码+实操】](https://blog.youkuaiyun.com/zyw2002/article/details/128732494)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值