USACO 4.2.1 网络流 EK

本文介绍了一个使用C++实现的最大流算法程序,通过不断寻找增广路径来更新流量矩阵,最终求得从源点到汇点的最大流量。该程序读取自定义文件作为输入,并将计算结果输出至指定文件。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<iostream>
#include<algorithm>
#define For(i,j,k) for (i=j;i<=k;i++)
#define reload y=q[i].x,x=q[q[i].fa].x
using namespace std;

const int dmax=2100,maxn=210,INF=1000000000;
int c[maxn][maxn],f[maxn][maxn];
bool p[dmax]; 
struct node{
	int x;
	int fa;
};
struct node q[dmax];

int main(){
	int i,j,k,m,n,x,y,z;
	freopen("ditch.in","r",stdin);
	freopen("ditch.out","w",stdout);
	scanf("%d%d",&m,&n);
	For(i,1,m){
		scanf("%d%d%d",&x,&y,&z);
		c[x][y]+=z;
	}
	int flag=1,s,t;
	while (flag){
		flag=0;
		s=0,t=1;
		memset(p,0,sizeof(p));
		q[t].x=1;
		q[t].fa=0;
		p[1]=1;
		while (s<t){
			s++;
			k=q[s].x;
			For(i,1,n)
				if ((c[k][i]>f[k][i] || f[i][k]>0) && !p[i]){
					q[++t].x=i;
					q[t].fa=s;
					p[i]=1;
					if (i==n){
						flag=1;
						break;
					}
				}
			if (flag)
				break;
		}
		if (!flag)
			break;
		int min=INF;
		i=t;
		while (q[i].fa!=0){
			reload;
			if (c[x][y]-f[x][y]<min && c[x][y]>f[x][y])
				min=c[x][y]-f[x][y];
			else if (f[y][x]>0 && f[y][x]<min)
				min=f[y][x];
			i=q[i].fa;
		}
		i=t;
		while (q[i].fa!=0){
			reload;
			if (c[x][y]>f[x][y])
				f[x][y]+=min;
			else
				f[y][x]-=min;
			i=q[i].fa;
		}
	}
	int ans=0;
	For(i,2,n)
		ans+=f[1][i];
	printf("%d\n",ans);
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值