费用流板子

bool spfa(){
	queue<int>que;
	que.push(s);
	memset(dis,INF,sizeof(dis));
	dis[s]=0;
	while(!que.empty()){
		int u=que.front();
		que.pop();
		vis[u]=0;
		for(int i=head[u];~i;i=edge[i].nextt){
			int v=edge[i].v;
			if(edge[i].w&&dis[v]>dis[u]+edge[i].cost){
				dis[v]=dis[u]+edge[i].cost;
				if(!vis[v])
					que.push(v),vis[v]=1;
			}
		}
	}
	return dis[t]!=INF;
}
int dfs(int u,int fl){
	if(u==t){
		return fl;
	}
	int ans=0;
	vis[u]=1;
	for(int i=cur[u];~i;i=edge[i].nextt){
		int v=edge[i].v;
		if(!vis[v]&&edge[i].w&&dis[v]==dis[u]+edge[i].cost){
			cur[u]=i;
			int x=dfs(v,min(fl-ans,edge[i].w));
			ans+=x;
			edge[i].w-=x;
			edge[i^1].w+=x;
			mincost+=x*edge[i].cost;
			if(ans==fl)
				break;
		}
	}
	vis[u]=0;
	return ans;
}
void MCMF(){
	
	while(spfa()){
		for(int i=0;i<=t;i++)
			cur[i]=head[i];
		dfs(s,INF);
	}
}

  

posted @ 2019-05-19 23:48  starve_to_death  阅读(129)  评论(0编辑  收藏  举报