用户ID: 密码: 验证:

登 录

注 册 取回密码

中山教育

中山国际网

中国教育在线

时代财富科技公司 FortuneAge Technology Co., Ltd. 校园博客客服网站(新)

我的资料

Mpq

博客信息

积分:988
等级:4级 lv 4
日志总数:231
发表评论总数:18 ( 查看)
获得评论总数:21
发表留言总数:0
所属学校:三鑫
收藏本站:

最新公告

欢迎光临我的博客!

最新相册

我的日历

最新评论

--游客
好文好文,是您的手笔?如果是您的文章,如果您愿意和我联系,...
还有就是数学不能使用计算器…….......在读初中之前原...
--Mpq
这次似乎不举行冬季长跑……看来在三鑫参加的体育项目最终是以...
--Mpq
看了你的"总结", 挺有针对性的! 相信下学期你一定会有...

RSS


首页 -> Zoj题库->Reactor Cooling
Reactor Cooling

Reactor Cooling


Time limit: 5 Seconds   Memory limit: 32768K   Special Judge
Total Submit: 363   Accepted Submit: 107  


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:

fi,1+fi,2+...+fi,N = f1,i+f2,i+...+fN,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

 
 
 
 
Program Zoj_2314_Mpq;
Const Maxn=201;
var
  m,s,t,n,tot:longint;
  a,b,queue:array[1..Maxn] of longint;
  e:array[1..Maxn*Maxn,1..2] of Longint;
  v:array[1..Maxn] of record fa:integer; p:boolean; end;
  Map:array[1..Maxn,1..Maxn] of record Min,flow,limit:longint; end;
procedure init;
var
  i,Min,Max:longint;
begin
  fillchar(Map,sizeof(Map),0);
  fillchar(a,sizeof(a),0);
  fillchar(b,sizeof(b),0);
  readln;
  readln(n,m);
  for i:=1 to m do
  begin
    readln(e[i,1],e[i,2],Min,Max);
    Map[e[i,1],e[i,2]].limit:=Max-Min;
    Map[e[i,1],e[i,2]].Min:=Min;
    inc(a[e[i,2]],Min);
    inc(b[e[i,1]],Min);
  end;
  s:=n+1; t:=n+2;
  for i:=1 to n do
  begin
    Map[s,i].limit:=a[i];
    Map[i,t].limit:=b[i];
  end;
end;
function Mins(a,b:longint):longint;
begin
  if a<b then exit(a) else exit(b);
end;
procedure MaxFlow;
var
  i,j,Min,head,last:longint;
begin
  while true do
  begin
    fillchar(v,sizeof(v),0);
    v[s].fa:=s; queue[1]:=s;
    head:=1; Last:=1;
    repeat
      if head<=Last then i:=queue[head] else break;
      v[i].p:=true;
      for j:=1 to n+2 do
        if (v[j].fa=0) and (Not v[j].p) then
          if Map[i,j].flow<Map[i,j].limit then
          begin
            inc(last);
            queue[last]:=j;
            v[j].fa:=i;
          end else
          if Map[j,i].flow>0 then
          begin
            inc(last);
            queue[last]:=j;
            v[j].fa:=-i;
          end;
      inc(head);
    until v[t].fa<>0;
    if v[t].fa=0 then break;
    Min:=Maxlongint;
    i:=t;
    while i<>s do
    begin
      if v[i].fa<0 then Min:=Mins(Map[i,abs(v[i].fa)].flow,Min) else
                        Min:=Mins(Map[v[i].fa,i].limit-Map[v[i].fa,i].flow,Min);
      i:=abs(v[i].fa);
    end;
    i:=t;
    while i<>s do
    begin
      if v[i].fa<0 then dec(Map[i,abs(v[i].fa)].flow,Min) else
                        inc(Map[v[i].fa,i].flow,Min);
      i:=abs(v[i].fa);
    end;
  end;
end;
procedure Print;
var
  i:longint;
begin
  for i:=1 to n do
    if map[s,i].flow<map[s,i].limit then
    begin
      writeln('NO');
      exit;
    end;
  writeln('YES');
  for i:=1 to m do
    writeln(Map[e[i,1],e[i,2]].flow+Map[e[i,1],e[i,2]].Min);
end;
begin
  readln(tot);
  for tot:=1 to tot do
  begin
    if tot>1 then writeln;
    init;
    MaxFlow;
    Print;
  end;
end.

网友评论

共 0 页,0 条记录  

用户名:
密码:
您的评论:
正在载入编辑器...
请输入验证码:


发 表 评 论

Mpq-中山教师家园