您的位置:首页 > 理论基础 > 计算机网络

【无源汇的上下界网络流】【模板】

2015-09-12 11:01 627 查看
上界改容量,下界先流走。

U -> V之间添加一条 cap - down的边

S->U 为U多出来的入的下界- 出的下界

V -> T 为V多出来的出的下界-入的下界

Max_Flow<int> MF;
int n,m;
const int maxn = 210;
const int maxm = 40010;
int a[maxn];
int id[maxm];
int up[maxm],down[maxm];
int main()
{
    freopen("in.txt","r",stdin);
    //freopen("out.txt","w",stdout);
    while(scanf("%d%d",&n,&m) != EOF)
	{
		memset(res,0,sizeof(res));
		MF.Init(n+4,1,2);
		memset(a,0,sizeof(a));
		int u,v;
		for(int i=0;i<m;i++)
		{
			scanf("%d%d%d%d",&u,&v,&down[i],&up[i]);
			a[u] -= down[i];
			a[v] += down[i];
			id[i] = E^1;	
			MF.Add_edge(u,v,up[i]-down[i]);
		}

		int sum = 0;
	   	for(int i=1;i<=n;i++)
		{
			if(a[i] > 0) 
			{
				MF.Add_edge(0,i,a[i]);
				sum += a[i];
			}
			else if(a[i] < 0) MF.Add_edge(i,n+1,-a[i]);
		}	
		MF.Changenst(n+2,0,n+1);	
		if(MF.Dinic() < sum) printf("NO\n");	
		else
		{
			printf("YES\n");
			for(int i=0;i<m;i++)
			{
				printf("%d\n",down[i]+res[i]);
			}
		}

	}
 
    return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: