P2686 Matrix

还是二分图,源点 S 汇点 T , x[i]->y[i] 流量 1 权值 -cost 作为限制不重点, y[i]->x[i+1] /y[i]->x[i+n]  流量 inf 权值 0 为边, S->x[1] 流量 2 权值 0 为起点, y[n*n]->T 流量 2 权值 0 为终点, x[1]->y[1]/x[n*n]->y[n*n] 流量 1 权值 0 方便回来的时候不重复计算cost。这样的话最短路找增广路,最短路径值的相反数即为最大值,本题是最大费用最大流。

  1 const maxe=1000000; inf=1000000000;
  2 type
  3   node=record
  4     next,t,cap,cost:longint;
  5   end;
  6 var time,n,k,s,t,ans,temp,cnt:longint;
  7 b:array[0..maxe] of node;
  8 head,go,f,d:array[0..maxe] of longint;
  9 p:array[0..maxe] of boolean;
 10 procedure add(u,v,x,y:longint);
 11 begin
 12   inc(cnt);
 13   with b[cnt] do
 14     begin
 15       next:=head[u];
 16       t:=v;
 17       cap:=x;
 18       cost:=y;
 19     end;
 20   head[u]:=cnt;
 21 end;
 22 procedure insert(u,v,x,y:longint);
 23 begin
 24   add(u,v,x,y);
 25   add(v,u,0,-y);
 26 end;
 27 procedure intit;
 28 var i,j,k,now,temp:longint;
 29 begin
 30   cnt:=-1; k:=n*n; s:=0; t:=2*k+1; ans:=0;
 31   fillchar(head,sizeof(head),255);
 32   fillchar(b,sizeof(b),255);
 33   for i:=1 to n do
 34     begin
 35       for j:=1 to n do
 36         begin
 37           read(temp); now:=(i-1)*n+j;
 38           insert(now,now+k,1,-temp);
 39           if i<>n then insert(now+k,now+n,inf,0);
 40           if j<>n then insert(now+k,now+1,inf,0);
 41         end;
 42       readln;
 43     end;
 44   insert(s,1,2,0);
 45   insert(1,k+1,1,0);
 46   insert(k,2*k,1,0);
 47   insert(2*k,t,2,0);
 48   readln(n);
 49 end;
 50 function spfa:longint;
 51 var e,v,l,r,point:longint;
 52 begin
 53   fillchar(p,sizeof(p),true);
 54   fillchar(go,sizeof(go),255);
 55   for l:=s to t do d[l]:=inf;
 56   l:=1; r:=1; f[1]:=s; p[s]:=false; d[s]:=0;
 57   while l<=r do
 58     begin
 59       point:=f[l];
 60       e:=head[point];
 61       while e<>-1 do
 62         begin
 63           v:=b[e].t;
 64           if (d[v]>d[point]+b[e].cost) and (b[e].cap>0) then
 65             begin
 66               d[v]:=d[point]+b[e].cost;
 67               go[v]:=e;
 68               if p[v] then
 69                 begin
 70                   p[v]:=false;
 71                   inc(r);
 72                   f[r]:=v;
 73                 end;
 74             end;
 75           e:=b[e].next;
 76         end;
 77       inc(l);
 78       p[point]:=true;
 79     end;
 80   if d[t]<>inf then exit(-d[t])
 81     else exit(-1);
 82 end;
 83 function min(a,b:longint):longint;
 84 begin if a>b then exit(b) else exit(a); end;
 85 function delete:longint;
 86 var now,flow:longint;
 87 begin
 88   now:=t; flow:=inf;
 89   while go[now]<>-1 do
 90     begin
 91       flow:=min(flow,b[go[now]].cap);
 92       now:=b[go[now] xor 1].t;
 93     end;
 94   now:=t;
 95   while go[now]<>-1 do
 96     begin
 97       dec(b[go[now]].cap,flow);
 98       inc(b[go[now] xor 1].cap,flow);
 99       now:=b[go[now] xor 1].t;
100     end;
101   exit(flow);
102 end;
103 begin
104   readln(n);
105   while not(eof) do
106     begin
107       intit;
108       temp:=spfa;
109       while temp>0 do
110         begin
111           inc(ans,temp*delete);
112           temp:=spfa;
113         end;
114       writeln(ans);
115     end;
116 end.

其实代码里面乘的delete也是不需要的(因为最大流一定为1)。

(转载请注明出处:http://www.cnblogs.com/Kalenda/)

时间: 2024-10-25 20:23:19

P2686 Matrix的相关文章

hdu 5015 233 Matrix (矩阵快速幂)

题意: 有一种矩阵,它的第一行是这样一些数:a  0,0 = 0, a 0,1 = 233,a 0,2 = 2333,a 0,3 = 23333... 除此之外,在这个矩阵里, 我们有 a i,j = a i-1,j +a i,j-1( i,j ≠ 0).现在给你 a 1,0,a 2,0,...,a n,0, 你能告诉我a n,m 是多少吗? n,m(n ≤ 10,m ≤ 10 9)输出 a n,m mod 10000007. 思路:首先我们观察n和m的取值范围,会发现n非常小而m却非常大,如果

【数组】Spiral Matrix II

题目: Given an integer n, generate a square matrix filled with elements from 1 to n2 in spiral order. For example,Given n = 3, You should return the following matrix: [ [ 1, 2, 3 ], [ 8, 9, 4 ], [ 7, 6, 5 ] ] 思路: 本质上和上一题是一样的,这里我们要用数字螺旋的去填充矩阵.同理,我们也是逐个环

Spiral Matrix(LintCode)

Spiral Matrix Given a matrix of m x n elements (m rows, n columns), return all elements of the matrix in spiral order. Example Given the following matrix: [ [ 1, 2, 3 ], [ 4, 5, 6 ], [ 7, 8, 9 ] ] You should return [1,2,3,6,9,8,7,4,5]. 难得的一次AC! 虽然感觉题

LeetCode:Spiral Matrix II - 将元素1-n^2以螺旋序填充到矩阵

1.题目名称 Spiral Matrix(螺旋输出矩阵中的元素) 2.题目地址 https://leetcode.com/problems/spiral-matrix-ii/ 3.题目内容 英文:Given an integer n, generate a square matrix filled with elements from 1 to n2 in spiral order. 中文:给出一个整数n,生成一个矩阵,使用数字1到n^2以螺旋顺序填充这个矩阵 例如:给出n=3,则生成如下矩阵:

LeetCode:Spiral Matrix - 螺旋输出矩阵中的元素

1.题目名称 Spiral Matrix(螺旋输出矩阵中的元素) 2.题目地址 https://leetcode.com/problems/spiral-matrix/ 3.题目内容 英文:Given a matrix of m x n elements (m rows, n columns), return all elements of the matrix in spiral order. 中文:给出一个m行n列的矩阵,以螺旋顺序返回矩阵中的所有元素. 例如:现有矩阵如下: [  [ 1,

HDU 2686 Matrix(最大费用流)

Matrix Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 1890    Accepted Submission(s): 1005 Problem Description Yifenfei very like play a number game in the n*n Matrix. A positive integer numbe

UVA 11992(Fast Matrix Operations-线段树区间加&amp;改)[Template:SegmentTree]

Fast Matrix Operations There is a matrix containing at most 106 elements divided into r rows and c columns. Each element has a location (x,y) where 1<=x<=r,1<=y<=c. Initially, all the elements are zero. You need to handle four kinds of operati

U3D开发者福利 MATRIX : UNITY 游戏技术咨询免费开放

UNITE 2015 BEIJING 于2015年4月18日-20日,在北京国家会议中心隆重举行.在这场被媒体誉为"行业风向标"的大会上,Unity 大中华区总裁符国新提到2015年Unity 将在全球范围内着重发展线上增值服务,并宣布Unity 将在大中华区开启"Matrix 游戏技术咨询". Matrix -最专业的游戏技术咨询平台 Matrix 是由Unity 大中华区的技术咨询团队研发的,旨在帮助游戏团队更加方便.准确地定位和解决游戏开发过程中所遇到的性能问

LeetCode—*Spiral Matrix问题,主要是用到了方向矩阵,很创意

Given a matrix of m x n elements (m rows, n columns), return all elements of the matrix in spiral order. For example, Given the following matrix: [ [ 1, 2, 3 ], [ 4, 5, 6 ], [ 7, 8, 9 ] ] You should return [1,2,3,6,9,8,7,4,5]. 这是一个螺旋排序的问题 这里遇到一个比较巧妙的