SPFA差分约束 70pts求调
查看原帖
SPFA差分约束 70pts求调
608273
___PatrickChen___楼主2023/8/2 15:12
#include <bits/stdc++.h>
#define endl '\n'

using namespace std;

typedef long long ll;

ll t,n,m,dis[200005],head[200005],k,cnt[200005],ans;
bool vis[200005];
struct edge{
	int v,w,next;
}e[500005];

void add(int u,int v,int w){
	e[++k]={v,w,head[u]};
	head[u]=k;
}

ll spfa(int s){
	deque<int>q;
	dis[s]=0;
	q.push_back(s);
	while(!q.empty()){
		int u=q.front();
		q.pop_front();
		vis[u]=0;
		for(int i=head[u];i;i=e[i].next){
			if(dis[e[i].v]>dis[u]+e[i].w){
				dis[e[i].v]=dis[u]+e[i].w;
				if(!vis[e[i].v]){
					vis[e[i].v]=1;
					if(q.size()&&dis[e[i].v]>dis[q.front()])q.push_back(e[i].v);
					else q.push_front(e[i].v);
					if(++cnt[e[i].v]>n)return -1;
				}
			}
		}
	}
	return dis[n];
}

int main(){
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
	cin >> n >> m;
	k=0;
	memset(dis,0x3f,sizeof dis);
	for(int i=1;i<=n;++i)add(i,i-1,0),add(i-1,i,1);
	for(int i=1;i<=m;++i){
		int u,v;
		cin >> u >> v;
		add(u-1,v,1),add(v,u-1,-1);
	}
	cout << spfa(0) << endl;
	return 0;
}

评测寄录

2023/8/2 15:12
加载中...