BZOJ2661 连连看 (费用流)
把所有点拆成两个,将符合条件的两个点x,y连上边,流量为1,费用为-(x+y)。
做一遍最小费用最大流,最后ans div 2即可。
Program bzoj2661;
const INF=;
var last,next,p,cost,cap,q:array[..] of longint;
flag1,flag2:array[..] of boolean;
a,c,i,j,x,y,t,s,sum:longint;
b:array[..] of longint;
pd:array[..] of boolean;
d,ps:array[..] of longint;
function gcd(x,y:longint):longint;
begin
if y= then exit(x) else exit(gcd(y,x mod y));
end;
procedure add(x,y,f,c:longint);
begin
inc(sum); next[sum]:=last[x]; last[x]:=sum;
p[sum]:=y; q[sum]:=x; cost[sum]:=c; cap[sum]:=f;
end;
procedure adt(x,y,f,c:longint);
begin
add(x,y,f,c); add(y,x,,-c);
end;
procedure spfa;
var i,j,l,r:longint;
begin
for i:= to t do d[i]:=INF;
fillchar(pd,sizeof(pd),false);
l:=; r:=; pd[s]:=true; b[]:=s; d[s]:=;
while l<=r do
begin
i:=last[b[l]];
while i<> do
begin
if (cap[i]>) and (d[p[i]]>d[b[l]]+cost[i]) then
begin
d[p[i]]:=d[b[l]]+cost[i];
ps[p[i]]:=i;
if not pd[p[i]] then
begin
inc(r);
b[r]:=p[i];
pd[p[i]]:=true;
end;
end;
i:=next[i];
end;
pd[b[l]]:=false;
inc(l);
end;
end;
procedure minCmaxF;
var x,i,j,cc,f,min:longint;
begin
f:=; cc:=;
while true do
begin
spfa;
if d[t]=INF then
begin
writeln(f div ,' ',-cc div );
exit;
end;
min:=INF;
x:=t;
while x<>s do
begin
if cap[ps[x]]<min then min:=cap[ps[x]];
x:=q[ps[x]];
end;
x:=t;
while x<>s do
begin
dec(cap[ps[x]],min);
inc(cap[ps[x] xor ],min);
x:=q[ps[x]];
end;
cc:=cc+min*d[t];
f:=f+min;
end;
end;
begin
readln(a,c);
s:=;
for i:=a to c do
for j:=a to c do if (i<>j) then
begin
x:=trunc(sqrt(abs(i*i-j*j)));
if x*x<>abs(i*i-j*j) then continue;
if gcd(i,j)<> then continue;
add(i,j+c,,-(i+j));
end;
for i:=a to c do add(,i,,);
for i:=a to c do add(i+c,c*+,,);
s:=; t:=*c+;
minCmaxF;
end.
BZOJ2661 连连看 (费用流)的更多相关文章
- [BZOJ2661][BeiJing wc2012]连连看 费用流
2661: [BeiJing wc2012]连连看 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 1349 Solved: 577[Submit][ ...
- BZOJ 2661: [BeiJing wc2012]连连看 费用流
2661: [BeiJing wc2012]连连看 Description 凡是考智商的题里面总会有这么一种消除游戏.不过现在面对的这关连连看可不是QQ游戏里那种考眼力的游戏.我们的规则是,给出一个闭 ...
- 【费用流】bzoj2661 [BeiJing wc2012]连连看
将每个数拆点,互相连边,然后满足条件的数对之间互相连边,跑最大费用流,答案是流量和费用分别除以2. 一定要i->j.j->i都连上,否则可能会出现一个数在一边被选择了,在另一边的另一个匹配 ...
- BZOJ_2661_[BeiJing wc2012]连连看_费用流
BZOJ_2661_[BeiJing wc2012]连连看_费用流 Description 凡是考智商的题里面总会有这么一种消除游戏.不过现在面对的这关连连看可不是QQ游戏里那种考眼力的游戏.我们的规 ...
- hdu-5988 Coding Contest(费用流)
题目链接: Coding Contest Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Ot ...
- POJ2195 Going Home[费用流|二分图最大权匹配]
Going Home Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 22088 Accepted: 11155 Desc ...
- BZOJ3130: [Sdoi2013]费用流[最大流 实数二分]
3130: [Sdoi2013]费用流 Time Limit: 10 Sec Memory Limit: 128 MBSec Special JudgeSubmit: 960 Solved: 5 ...
- 洛谷 1004 dp或最大费用流
思路: dp方法: 设dp[i][j][k][l]为两条没有交叉的路径分别走到(i,j)和(k,l)处最大价值. 则转移方程为 dp[i][j][k][l]=max(dp[i-1][j][k-1][l ...
- Codeforces 730I [费用流]
/* 不要低头,不要放弃,不要气馁,不要慌张 题意: 给两行n个数,要求从第一行选取a个数,第二行选取b个数使得这些数加起来和最大. 限制条件是第一行选取了某个数的条件下,第二行不能选取对应位置的数. ...
- zkw费用流+当前弧优化
zkw费用流+当前弧优化 var o,v:..] of boolean; f,s,d,dis:..] of longint; next,p,c,w:..] of longint; i,j,k,l,y, ...
随机推荐
- Touch ID集成
作者感言 这个国庆由于种种原因, 过的不太安稳, 搬家, 办证, 东跑西跑, 忙的压根就不像是在过节....不过算了, 挑最后一天写写博文.最后:如果你有更好的建议或者对这篇文章有不满的地方, 请联系 ...
- 《JavaScript权威指南》读书笔记(一)
日期 2015-11-28 把之前的读书笔记在我弄丢它之前搬过来~~ 时间过去好久,回头一看理解都不一样了. 重点浏览了一下和Java的不同之处: js是一种宽松类型语言:js不区别整形数值与浮点型数 ...
- easyui $.parser.parse 页面重新渲染
一些dom元素是动态拼接上的easui的样式,由于页面已经渲染过了,所以需要手动执行渲染某个部件或者整个页面 $.parser.parse(); // parse all the page $.par ...
- Linux下lzop命令安装
[root@xd502djj ~]# yum install lzop Loaded plugins: fastestmirror Determining fastest mirrors * base ...
- struts2视频学习笔记 15-17 (访问或添加request属性,文件上传)
课时15 访问或添加request/session/application属性 1.简单说 page指当前页面.在一个jsp页面里有效 2.request 指从http请求到服务器处理结束,返回响应的 ...
- PHPExcel 学习笔记
首先到phpexcel官网上下载最新的phpexcel类,下周解压缩一个classes文件夹,里面包含了PHPExcel.php和PHPExcel的文件夹,这个类文件和文件夹是我们需要的,把class ...
- POJ 2771 二分图(最大独立集)
Guardian of Decency Time Limit: 3000MS Memory Limit: 65536K Total Submissions: 5244 Accepted: 21 ...
- UVa 11426 - GCD - Extreme (II)
http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&p ...
- C++之函数fgetc和fputc、fgets和fputs、fread和fwrite、fscanf和fprintf用法小结
#include <iostream> #include <cstdio> #include <cstdlib> using namespace std; int ...
- set常见操作:
(1)sadd 向一个集合中添加一个元素.例如:sadd set1 Hello (2)smembers 查看集合中的所有元素.例如:smembers set1 (3)srem 删除集合中一个指定的元素 ...