差分约束学习笔记
2023.5.6 写的太烂了重新写
差分约束系统
定义#
差分约束系统是一种特殊的
元一次不等式组,它包含 个变量 以及 个约束条件,每一个约束条件都是两个其中的变量做差构成的,形如 ,其中 并且 是常数(可以为正数或非正数)。
------- OI Wiki
通俗一点讲,这类问题都是给定
有了这些条件,一般的题目会让你求出一组合法的解,也就是求这
过程#
我们可以建一个超级源点,然后向每一个点连一条边权为
我们在求解的时候一般用 SPFA 来跑,虽然他最坏的时间复杂度是
最后一个问题,最后转化的式子是
但是我觉得,当你建图的时候使用的是
如果使用的是
P5960 【模板】差分约束算法#
code:
#include<bits/stdc++.h>
#define INF 0x3f3f3f3f
#define N 50100
using namespace std;
int n,m,cnt,head[N];
queue<int>q;
struct SB{int w,v,next;}e[N<<1];
int dis[N],tot[N],vis[N];
inline void add(int u,int v,int w)
{
e[++cnt].v=v;
e[cnt].w=w;
e[cnt].next=head[u];
head[u]=cnt;
}
int SPFA()
{
q.push(0);
vis[0]=1;
tot[0]++;
while(!q.empty())
{
int u=q.front();
q.pop();
vis[u]=0;
for(int i=head[u];i;i=e[i].next)
{
int v=e[i].v,w=e[i].w;
if(dis[v]>dis[u]+w)
{
dis[v]=dis[u]+w;
q.push(v);
vis[v]=1;
tot[v]++;
if(tot[v]==n+1)
return 0;
}
}
}
return 1;
}
int main()
{
cin>>n>>m;
for(int i=1;i<=n;i++)
dis[i]=INF;
for(int i=1;i<=n;i++)
add(0,i,0);
for(int i=1;i<=m;i++)
{
int x,y,z;
cin>>x>>y>>z;
add(y,x,z);
}
if(!SPFA())
cout<<"NO"<<endl;
else
for(int i=1;i<=n;i++)
cout<<dis[i]<<" ";
return 0;
}
作者: 北烛青澜
出处:https://www.cnblogs.com/Multitree/p/16756214.html
本站使用「CC BY 4.0」创作共享协议,转载请在文章明显位置注明作者及出处。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!