求助差分约束
查看原帖
求助差分约束
140876
syzf2222楼主2021/3/31 14:59

这题要求最大值,为什么可以跑最短路?

还有我的最长路为什么就过一个点啊?

#include<bits/stdc++.h>
using namespace std;
#define inf 1e9
const int maxn=2e6+10;
const int mod=1e9+7;
int n,m;
inline int read(){
	int x=0,f=1;char c=getchar();
	while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}
	while(c>='0'&&c<='9'){x=(x<<1)+(x<<3)+c-'0';c=getchar();}
	return x*f;
}
/*
dis[i]>=dis[i-1]
dis[i]<=dis[i-1]+1
dis[b_i]<=dis[a_i-1]+1
dis[b_i]>=dis[a_i-1]+1
*/
int beg[maxn],nex[maxn],to[maxn],w[maxn],e;
inline void add(int x,int y,int z){
	e++;nex[e]=beg[x];
	beg[x]=e;to[e]=y;w[e]=z;
}
int dis[maxn],cnt[maxn],vis[maxn];
queue<int>q;
int main(){
	n=read(),m=read();
	for(int i=1;i<=n;i++)
		add(i-1,i,0),add(i,i-1,-1);
	int x,y;
	for(int i=1;i<=m;i++){
		x=read()-1,y=read();
		add(y,x,-1),add(x,y,1);
	}
	for(int i=1;i<=n;i++)
		dis[i]=-inf;
	q.push(0);vis[0]=1;
	while(!q.empty()){
		x=q.front();
		q.pop();vis[x]=0; 
		for(int i=beg[x];i;i=nex[i]){
			y=to[i];
			if(dis[y]<dis[x]+w[i]){
				dis[y]=dis[x]+w[i];
				if(!vis[y]){
					vis[y]=1;
					q.push(y);
				}
			}
		}
	}
	printf("%d\n",dis[n]);
	return 0;
}
2021/3/31 14:59
加载中...