无源汇有上下界可行流存在定理

H - Reactor Cooling

Time Limit:5000MS     Memory Limit:32768KB     64bit IO Format:%lld & %llu

Submit Status

Description

The terrorist group leaded by a well known international terrorist Ben Bladen is buliding a nuclear reactor to produce plutonium for the nuclear bomb they are planning to create. Being the wicked computer genius of this group,
you are responsible for developing the cooling system for the reactor.

The cooling system of the reactor consists of the number of pipes that special cooling liquid flows by. Pipes are connected at special points, called nodes, each pipe has the starting node and the end point. The liquid must flow
by the pipe from its start point to its end point and not in the opposite direction.

Let the nodes be numbered from 1 to N. The cooling system must be designed so that the liquid is circulating by the pipes and the amount of the liquid coming to each node (in the unit of time) is equal to the amount of liquid
leaving the node. That is, if we designate the amount of liquid going by the pipe from i-th node to j-th as fij, (put fij = 0 if there is no pipe from node i to node j), for each i the following condition must hold:

i,1+f i,2+...+f i,N = f 1,i+f 2,i+...+f N,i

Each pipe has some finite capacity, therefore for each i and j connected by the pipe must be fij <= cij where cij is the capacity of the pipe. To provide sufficient cooling, the amount of the liquid flowing
by the pipe going from i-th to j-th nodes must be at least lij, thus it must be fij >= lij.

Given cij and lij for all pipes, find the amount fij, satisfying the conditions specified above.

This problem contains multiple test cases!

The first line of a multiple input is an integer N, then a blank line followed by N input blocks. Each input block is in the format indicated in the problem description. There is a blank line between input blocks.

The output format consists of N output blocks. There is a blank line between output blocks.

Input

The first line of the input file contains the number N (1 <= N <= 200) - the number of nodes and and M - the number of pipes. The following M lines contain four integer number each - i, j, lij and cij each. There is at most one
pipe connecting any two nodes and 0 <= lij<= cij <= 10^5 for all pipes. No pipe connects a node to itself. If there is a pipe from i-th node to j-th, there is no pipe from j-th node to i-th.

Output

On the first line of the output file print YES if there is the way to carry out reactor cooling and NO if there is none. In the first case M integers must follow, k-th number being the amount of liquid flowing by the k-th pipe.
Pipes are numbered as they are given in the input file.

Sample Input

2

4 6

1 2 1 2

2 3 1 2

3 4 1 2

4 1 1 2

1 3 1 2

4 2 1 2

4 6

1 2 1 3

2 3 1 3

3 4 1 3

4 1 1 3

1 3 1 3

4 2 1 3

Sample Input

NO

YES

1

2

3

2

1

1

这是一个无源汇有上下界处理是否存在可行流的网络最大流改进模型;

一个可行流的概念是    1)Ef(u,i) ==Ef(i,v)&&f(u,v)<=C(u,v),而有上下界的可行流概念是   2)Ef(u,i)
==Ef(i,v)&&B(u,v)<=f(u,v)<=C(u,v),因此将上下界的图转化为无下界的图。但在转化的时候,我们需要创造条件1,因此需要利用下界的条件进行推导:

http://wenku.baidu.com/view/0f3b691c59eef8c75fbfb35c.html

看懂上面的,这个题其实是个模板:

#include<stdio.h>
#include<string.h>
#include<queue>
#define INF 0x7fffffff
#define size 250
using namespace std;
struct node{
	int a,b,aa;
}vv[size];
queue<int>Q;
int map[size][size],pre[size];
int bfs(int s,int e){
	int flow[250];
	for(int i=s;i<=e;i++)pre[i] = -1;
	pre[s] = 0;
	while(!Q.empty())Q.pop();
	Q.push(s);
	flow[s] = INF;
	while(!Q.empty()){
		int a= Q.front();
		Q.pop();
		if(a==e)break;
		for(int i=s;i<=e;i++){
			if(map[a][i]>0&&pre[i]==-1){
				Q.push(i);
				pre[i] = a;
				flow[i] = min(flow[a],map[a][i]);
			}
		}
	}
	return pre[e]==-1?-1:flow[e];
}
int main(){
	int t;
	int ds[250][250],ru[250];
	int flow;
	scanf("%d",&t);
	while(t--){
		getchar();
		memset(ru,0,sizeof(ru));
		memset(map,0,sizeof(map));
		memset(ds,0,sizeof(ds));
		int m,n,a,b,aa,bb;
		scanf("%d%d",&n,&m);
		for(int i=0;i<m;i++){
			scanf("%d%d%d%d",&a,&b,&aa,&bb);
			map[a][b] = bb-aa;
			ru[b]+=aa;
			ru[a]-=aa;
			vv[i].a = a;
			vv[i].b = b;
			vv[i].aa = aa;
		}
		for(int i=1;i<=n;i++)
		if(ru[i]>=0)map[0][i] = ru[i];
		else map[i][n+1] = -1*ru[i];
		while((flow = bfs(0,n+1))!=-1){
			int k = n+1;
			while(k!=0){
				int last;
				last = pre[k];
				map[last][k] -=flow;
				map[k][last] +=flow;
				ds[last][k] +=1;
				k = last;
			}
		}
		int i;
		//for(int i=0;i<=n+1;i++)printf("map1 = %d map2 = %d ds1 = %d ds2 = %d\n",map[0][i],map[i][n+1],ds[0][i],ds[i][n+1]);
		for(i=0;i<=n+1;i++)
		if(map[0][i]==0&&map[i][n+1]==0);
		else break;
		if(i==n+2){
			puts("YES");
			for(i=0;i<m;i++)
			printf("%d\n",ds[vv[i].a][vv[i].b]+vv[i].aa);
		}
		else puts("NO");
		if(t!=0)printf("\n");
	}
} 

无源汇有上下界可行流存在定理

时间: 2024-08-10 18:05:50

无源汇有上下界可行流存在定理的相关文章

[loj#115] 无源汇有上下界可行流 网络流

#115. 无源汇有上下界可行流 内存限制:256 MiB时间限制:1000 ms标准输入输出 题目类型:传统评测方式:Special Judge 上传者: 匿名 提交提交记录统计讨论测试数据 题目描述 这是一道模板题. n nn 个点,m mm 条边,每条边 e ee 有一个流量下界 lower(e) \text{lower}(e)lower(e) 和流量上界 upper(e) \text{upper}(e)upper(e),求一种可行方案使得在所有点满足流量平衡条件的前提下,所有边满足流量限

LOJ #115. 无源汇有上下界可行流

#115. 无源汇有上下界可行流 描述 这是一道模板题. n n n 个点,m m m 条边,每条边 e e e 有一个流量下界 lower(e) \text{lower}(e) lower(e) 和流量上界 upper(e) \text{upper}(e) upper(e),求一种可行方案使得在所有点满足流量平衡条件的前提下,所有边满足流量限制. 输入格式 第一行两个正整数 n n n.m m m. 之后的 m m m 行,每行四个整数 s s s.t t t.lower \text{lowe

ZOJ 2314 Reactor Cooling(无源汇有上下界可行流)

题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=2314 题目大意: 给n个点,及m根pipe,每根pipe用来流躺液体的,单向的,每时每刻每根pipe流进来的物质要等于流出去的物质,要使得m条pipe组成一个循环体,里面流躺物质. 并且满足每根pipe一定的流量限制,范围为[Li,Ri].即要满足每时刻流进来的不能超过Ri(最大流问题),同时最小不能低于Li. 解题思路: 转自:https://www.cnbl

(一道模板题) 无源汇有上下界可行流

题目描述 这是一道模板题. n 个点,m  条边,每条边 e  有一个流量下界 lower(e) 和流量上界 upper(e),求一种可行方案使得在所有点满足流量平衡条件的前提下,所有边满足流量限制. 输入格式 第一行两个正整数 n .m . 之后的 m 行,每行四个整数 s .t .lower .upper. 输出格式 如果无解,输出一行 NO. 否则第一行输出 YES,之后 m  行每行一个整数,表示每条边的流量. 样例 样例输入 1 4 6 1 2 1 2 2 3 1 2 3 4 1 2

sgu194 Reactor Cooling【无源汇有上下界可行流】

这是模板题了吧,先建立附加源汇,然后保留每个点的in-out,如果这个值是正的,那么就从附加源先这个点连一个边权为in-out的边,否则从这个点向附加汇连一条相反数的边,剩下题目中的边就用上界-下界连就好了. 1 #include <bits/stdc++.h> 2 #define rep(i, a, b) for (int i = a; i <= b; i++) 3 #define drep(i, a, b) for (int i = a; i >= b; i--) 4 #def

hdu 4940 无源汇有上下界最大流

题意:给出一个有向强连通图,每条边有两个值分别是破坏该边的代价和把该边建成无向边的代价(建立无向边的前提是删除该边)问是否存在一个集合S,和一个集合的补集T,破坏所有S集合到T集合的边代价和是X,然后修复T到S的边为无向边代价和是Y,满足Y<X:满足输出unhappy,否则输出happy:</span> <span style="font-family: Arial, Helvetica, sans-serif;">分析:无源汇有上下界可行流判定, 原来每

【HDU 4940】Destroy Transportation system(数据水/无源无汇带上下界可行流)

Description Tom is a commander, his task is destroying his enemy’s transportation system. Let’s represent his enemy’s transportation system as a simple directed graph G with n nodes and m edges. Each node is a city and each directed edge is a directe

ZOJ2314 Reactor Cooling 无源汇有上下界最大流

推荐看这里 #include <iostream> #include <cstring> #include <cstdio> #include <queue> using namespace std; int n, m, uu, vv, ww, cc, hea[225], cnt, ss, tt, maxFlow, lev[225], tot, T; const int oo=0x3f3f3f3f; struct Edge{ int too, nxt, ca

ZOJ--2314--Reactor Cooling【无源汇上下界可行流】

链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=1314 题意:某恐怖组织要建立一个核反应堆,他们需要设计一个冷却系统,n个点由m个管子连接,为使液体循环流动,每个节点的总流入量需要等于总流出量,现告诉你每根管子的最小流量及最大流量及它们连接的两点(有向),问是否存在可行流,如存在,输出每个管子的流量. 有上下界的网络流分为四种:无源汇的上下界可行流.有源汇的上下界可行流.有源汇的上下界最大流.有源汇的上下界最小流,这道