dinic+spfa 死循环求调
查看原帖
dinic+spfa 死循环求调
766405
scyFBM楼主2023/2/13 17:14

P3376的代码直接改过来的 只加了当前弧优化 目测是spfa出了问题

代码

#include<bits/stdc++.h>
using namespace std;
const int N=100009;
const int inf=1e9;
int n,m,s,t;
int dis[N],flow[N],rad[N];
int ans1,ans2;
bool vis[N];
struct edge{
	int to,c,d;
	int nxt;
}e[N];
int hed[N],ecnt=1;
void add(int l,int r,int c,int d){
	e[ecnt].to=r;
	e[ecnt].c=c; 
	e[ecnt].d=d;
	e[ecnt].nxt=hed[l];
	hed[l]=ecnt;
	ecnt++; 
}
bool spfa(){
	queue<int> q;
	for(int i=1;i<=n;i++) dis[i]=inf;
	for(int i=1;i<=n;i++) vis[i]=0;
	q.push(s);
	vis[s]=1;
	dis[s]=0;
	while(!q.empty()){
		int cur=q.front();
		q.pop();
		vis[cur]=0;
		for(int i=hed[cur];i;i=e[i].nxt){
			if(e[i].c>0&&dis[e[i].to]>dis[cur]+e[i].d){
				dis[e[i].to]=dis[cur]+e[i].d;
				flow[e[i].to]=min(flow[cur],e[i].c);
				if(!vis[e[i].to]){
					q.push(e[i].to);
					vis[e[i].to]=1;
				}
			}
		}
	}
	return dis[t]<inf;
}
int dfs(int start,int flow){
	int cnt=0; 
	if(start==t) return flow;
	for(int i=rad[start];i&&flow;i=e[i].nxt){ 
		rad[start]=i;
		if(dis[e[i].to]==dis[start]+e[i].d&&e[i].c){
			int ret=dfs(e[i].to,min(flow,e[i].c)); 
			e[i].c-=ret; 
			e[i^1].c+=ret;
			cnt+=ret;
			flow-=ret;
			ans2+=ret*e[i].d;
		}
	}
	return cnt; 
}
int main(){
//	freopen("sj.txt","r",stdin);
	cin>>n>>m>>s>>t;
	for(int i=0;i<m;i++){
		int u,v,w,c;
		cin>>u>>v>>w>>c;
		add(u,v,w,c);
		add(v,u,0,-c);
	}
	int ans1=0,ans2=0;
	while(spfa()) ans1+=dfs(s,inf);
	cout<<ans1<<" "<<ans2<<endl;
	return 0;
}
2023/2/13 17:14
加载中...