请问这份费用流为什么会在#89 10输出0
查看原帖
请问这份费用流为什么会在#89 10输出0
467616
osky123456楼主2023/11/23 21:41

是参考cmd的代码写的

用spfa跑的EK

// Problem: P3381 【模板】最小费用最大流
// Contest: Luogu
// URL: https://www.luogu.com.cn/problem/P3381
// Memory Limit: 128 MB
// Time Limit: 1000 ms
#include<bits/stdc++.h>
using namespace std;
using ll = long long ;
const int maxn = 5100;
const int inf = 2e9;
int n,m,s,t,head[maxn],cnt=1;
struct node {
	int next,v,cap,w;
}edge[maxn<<1] ;
void add(int u,int v,int cap,int w) {
	edge[++cnt]=(node) {head[u],v,cap,w} ;
	head[u] = cnt ;
	edge[++cnt]=(node) {head[v],u,0,-w } ;
	head[v] = cnt ;
}
int pre[maxn],lp[maxn];
int dis[maxn],flow[maxn] ;
bool isins[maxn];
queue<int> q ;
int spfa() {
	for(int i=0;i<=n;++i) 
		dis[i]=inf,flow[i]=0;
	flow[s] = inf ;
	dis[s] = 0 ;
	q.push(s) ;isins[s] = 1 ;
	while(!q.empty()) {
		int u = q.front() ;
		isins[u] = 0 ;q.pop() ;
		for(int i = head[u],v;i;i=edge[i].next) {
			if(edge[i].cap && dis[v = edge[i].v] > dis[u] + edge[i].w) {
				dis[v] = dis[u] + edge[i].w ;
				flow[v] = min (flow[u],edge[i].cap) ;
				lp[v] = i ; pre[v] = u ;
				if(!isins[v]) isins[v] = 1,q.push(v) ;
			}
		}
 	}
 	return flow[t] ;
}
signed main(){
	ios::sync_with_stdio(false);
	cin.tie(nullptr);
	cin >> n >> m >> s >> t ;
	for(int i=1;i<=m;++i) {
		int u,v,w,c;
		cin >> u >> v >> w >> c ;
		add(u,v,w,c) ;
	}
	int d,ans=0,cans=0;
	while(d = spfa()) {
		int u = t;
		while(u!=s) {
			int last = pre[u] ;
			edge[lp[u]].cap -= d ;
			edge[lp[u]^1].cap += d;
			u = last;
		}
		ans += d;
		cans += d * dis[t] ;
	}
	cout << ans << ' ' << cans << '\n' ;
	return 0;
}


2023/11/23 21:41
加载中...