【图论】差分约束

本文探讨了图论中的差分约束系统,重点在于如何构建边以解决最长路问题。通过SPFA算法求解最小值时,需要特别注意边的添加方式。文章列举了洛谷平台上的相关题目,如P5960、P1250、P2294和P3275,并指出在特定条件下建边的策略。对于求最小数的情况,建图和SPFA的实现细节有所差异,建议采用倒序建边的方法来避免卡常问题。
摘要由CSDN通过智能技术生成

关于建边,如果需要求最小值(即最长路),一开始的话add(v,u,-w);
另外如果xi-xj<=k,那么建边(j,i,k)这个样子。
在这里插入图片描述
推荐博客:https://blog.csdn.net/consciousman/article/details/53812818
洛谷P5960:https://www.luogu.com.cn/problem/P5960

#include<bits/stdc++.h>
#define ll long long
#define rep(i,a,n) for(int i=a;i<=n;i++)
#define per(i,n,a) for(int i=n;i>=a;i--)
#define endl '\n'
#define eps 0.000000001
#define pb push_back
#define mem(a,b) memset(a,b,sizeof(a))
#define IO ios::sync_with_stdio(false);cin.tie(0);
using namespace std;
const int INF=0x3f3f3f3f;
const ll inf=0x3f3f3f3f3f3f3f3f;
const int mod=1e9+7;
const int maxn=1e5+5;
int tot,head[maxn];
struct E{
   
	int to,next,w;
}edge[maxn<<1];
void add(int u,int v,int w){
   
	edge[tot].to=v;
	edge[tot].w=w;
	edge[tot].next=head[u];
	head[u]=tot++;
}
int n,m;
int d[maxn],inq[maxn],cnt[maxn];
bool SPFA(int s){
   
	queue<int> q;
	q.push(s);d[s]=0,inq[s]=1;
	while(!q.empty()){
   
		int now=q.front();q.pop();
		inq[now]=0;
		for(int i=head[now];i!=-1;i=edge[i].next){
   
			int v=edge[i].to;
			if(d[v]>d[now]+edge[i].w){
   
				d[v]=d[now]+edge[i].w;
				cnt[v]=cnt[now]+1;
				if(cnt[v]>=n) return true;
				if(inq[v]==1) continue;
				q.push(v);
			}
		}
	}
	return false;
}
int main(){
   
	cin>>n>>m;mem(head,-1);
	rep(i,1,m){
   
		int u,v,w;cin>>u>>v>>w;
		add(v,u,w);
	}
	rep(i,1,n) add(0,<
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值