关于zkw费用流
  • 板块学术版
  • 楼主huayucaiji
  • 当前回复2
  • 已保存回复2
  • 发布时间2020/7/28 22:32
  • 上次更新2023/11/6 21:54:59
查看原帖
关于zkw费用流
132976
huayucaiji楼主2020/7/28 22:32

rt,蒟蒻最近做题发现有一题用 类Dinic 过不去,上网找到了zkw 大神的算法和网上其他人的介绍,我发现好像和 类Dinic 没啥差别啊。能否帮蒟蒻康康到底有什么差别/kel。

#include<bits/stdc++.h>
using namespace std;

const int maxn=400+10,inf=0x3fffffff; 

struct edge{
	int v,cap,cost,next;
}e[(200*200+200+200)*2+10];

int n,h[maxn],cnt,s,t,m,vis[maxn],dis[maxn],mincost;

void addedge(int u,int v,int w1,int w2) {
	e[cnt].v=v;
	e[cnt].cap=w1;
	e[cnt].cost=w2;
	e[cnt].next=h[u];
	h[u]=cnt++;
}

void insert(int u,int v,int w1,int w2) {
	addedge(u,v,w1,w2);
	addedge(v,u,0,-w2);
}

bool spfa() {
	fill(vis,vis+t+1,0);
	fill(dis,dis+t+1,inf);
	deque<int> q;
	q.push_back(s);
	vis[s]=1,dis[s]=0;
	
	while(!q.empty()) {
		int u=q.front();
		q.pop_front();
		vis[u]=0;
		
		for(int i=h[u];~i;i=e[i].next) {
			int v=e[i].v;
			
			if(e[i].cap&&dis[u]+e[i].cost<dis[v]) {
				dis[v]=dis[u]+e[i].cost;
				if(!vis[v]) {
					vis[v]=1;
					if(!q.empty()&&dis[v]<dis[q.front()]) {
						q.push_front(v);
					}
					else {
						q.push_back(v);
					}
				}
			}
		}
	}
	
	return dis[t]!=inf;
}

int dfs(int u,int maxflow) {
	if(u==t) {
		return maxflow;
	}
	vis[u]=1;
	
	int ans=0;
	for(int i=h[u];~i&&ans<maxflow;i=e[i].next) {
		int v=e[i].v;
		
		if(e[i].cap&&!vis[v]&&dis[v]==dis[u]+e[i].cost) {
			int flow=dfs(v,min(maxflow,e[i].cap));
			
			if(flow) {
				maxflow-=flow;
				ans+=flow;
				e[i].cap-=flow;
				e[i^1].cap+=flow;
				mincost+=e[i].cost*flow;
				
				if(maxflow==0) {
					break;
				}
			}
		}
	}
	vis[u]=0;
	
	return ans;
}

int main()
{
	memset(h,-1,sizeof(h));
	
	//建图的过程,蒟蒻就不展示了
    
	int ans=0;
	while(spfa()) {
		ans+=dfs(s,inf);
	}
	cout<<mincost<<endl;
	
	return 0;
}
2020/7/28 22:32
加载中...