首页 > 代码库 > BZOJ1877: [SDOI2009]晨跑

BZOJ1877: [SDOI2009]晨跑

1877: [SDOI2009]晨跑

Time Limit: 4 Sec  Memory Limit: 64 MB
Submit: 1024  Solved: 540
[Submit][Status]

Description

Elaxia最近迷恋上了空手道,他为自己设定了一套健身计划,比如俯卧撑、仰卧起坐等 等,不过到目前为止,他坚持下来的只有晨跑。 现在给出一张学校附近的地图,这张地图中包含N个十字路口和M条街道,Elaxia只能从 一个十字路口跑向另外一个十字路口,街道之间只在十字路口处相交。Elaxia每天从寝室出发 跑到学校,保证寝室编号为1,学校编号为N。 Elaxia的晨跑计划是按周期(包含若干天)进行的,由于他不喜欢走重复的路线,所以 在一个周期内,每天的晨跑路线都不会相交(在十字路口处),寝室和学校不算十字路 口。Elaxia耐力不太好,他希望在一个周期内跑的路程尽量短,但是又希望训练周期包含的天 数尽量长。 除了练空手道,Elaxia其他时间都花在了学习和找MM上面,所有他想请你帮忙为他设计 一套满足他要求的晨跑计划。

Input

第一行:两个数N,M。表示十字路口数和街道数。 接下来M行,每行3个数a,b,c,表示路口a和路口b之间有条长度为c的街道(单向)。

Output

两个数,第一个数为最长周期的天数,第二个数为满足最长天数的条件下最短的路程长 度。

Sample Input

7 10
1 2 1
1 3 1
2 4 1
3 4 1
4 5 1
4 6 1
2 5 5
3 6 6
5 7 1
6 7 1

Sample Output

2 11

HINT

对于30%的数据,N ≤ 20,M ≤ 120。
对于100%的数据,N ≤ 200,M ≤ 20000。

Source

Day1

题解:
不废话,裸费用流
代码:
  1 const inf=maxlongint;  2 type node=record  3      from,go,next,v,c:longint;  4      end;  5 var e:array[0..2000000] of node;  6     pre,head,q,d:array[0..1000000] of longint;  7     v:array[0..1000000] of boolean;  8     i,j,n,m,s,t,l,r,mincost,tot,x,y,z,maxflow:longint;  9 function min(x,y:longint):longint; 10  begin 11  if x<y then exit(x) else exit(y); 12  end; 13 procedure ins(x,y,z,w:longint); 14  begin 15  inc(tot); 16  with e[tot] do 17   begin 18   from:=x;go:=y;v:=z;c:=w;next:=head[x];head[x]:=tot; 19   end; 20  end; 21 procedure insert(x,y,z,w:longint); 22  begin 23  ins(x,y,z,w);ins(y,x,0,-w); 24  end; 25 function spfa:boolean; 26  var i,x,y:longint; 27  begin 28  fillchar(v,sizeof(v),false); 29  for i:=s to t do d[i]:=inf; 30  l:=0;r:=1;q[1]:=s;d[s]:=0;v[s]:=true; 31  while l<r do 32   begin 33   inc(l);if l=1000000 then l:=0; 34   x:=q[l];v[x]:=false; 35   i:=head[x]; 36   while i<>0 do 37    begin 38    y:=e[i].go; 39    if (e[i].v<>0) and (d[x]+e[i].c<d[y]) then 40     begin 41     d[y]:=d[x]+e[i].c; 42     pre[y]:=i; 43     if not(v[y]) then 44      begin 45      v[y]:=true; 46      inc(r);if r=1000000 then r:=0; 47      q[r]:=y; 48      end; 49     end; 50    i:=e[i].next; 51   end; 52  end; 53  exit(d[t]<>inf); 54  end; 55 procedure mcf; 56  var i,tmp:longint; 57  begin 58  mincost:=0;maxflow:=0; 59  while spfa do 60   begin 61   tmp:=inf; 62   i:=pre[t]; 63   while i<>0 do 64    begin 65    tmp:=min(tmp,e[i].v); 66    i:=pre[e[i].from]; 67    end; 68   inc(mincost,tmp*d[t]); 69   inc(maxflow,tmp); 70   i:=pre[t]; 71   while i<>0 do 72    begin 73    dec(e[i].v,tmp); 74    inc(e[i xor 1].v,tmp); 75    i:=pre[e[i].from]; 76    end; 77   end; 78  end; 79 procedure init; 80  begin 81  tot:=1; 82  readln(n,m); 83  for i:=1 to m do 84   begin 85   readln(x,y,z); 86   insert(x+n,y,1,z); 87   end; 88  for i:=2 to n-1 do insert(i,i+n,1,0); 89  s:=1;t:=2*n; 90  insert(s,s+n,inf,0);insert(n,t,inf,0); 91  end; 92 procedure main; 93  begin 94  mincost:=0; 95  mcf; 96  writeln(maxflow, ,mincost); 97  end; 98 begin 99  assign(input,input.txt);assign(output,output.txt);100  reset(input);rewrite(output);101  init;102  main;103  close(input);close(output);104 end.     
View Code