bzoj2893
有起点终点的限制的路径覆盖
首先tarjan缩点成DAG
似乎不能按照二分匹配的做法做
那么建立源汇拆点i,i',这两点之间连一条下界为1上界无穷的边,
其它边都是下界为0,上界正无穷
然后就是有源有汇的最小流,之前在bzoj2502介绍过
const inf=;
type node=record
po,flow,next:longint;
end; var w,e:array[..] of node;
be,p,q,c,dfn,low,cur,a,b:array[..] of longint;
v,f:array[..] of boolean;
na,nb,h,ss,tt,t,te,s,len,n,m,i,x,y,j:longint; function min(a,b:longint):longint;
begin
if a>b then exit(b) else exit(a);
end; procedure add(x,y:longint);
begin
inc(len);
w[len].po:=y;
w[len].next:=q[x];
q[x]:=len;
end; procedure build(x,y,f:longint);
begin
inc(len);
e[len].po:=y;
e[len].flow:=f;
e[len].next:=p[x];
p[x]:=len;
end; procedure tarjan(x:longint);
var i,y:longint;
begin
inc(h);
dfn[x]:=h;
low[x]:=h;
v[x]:=true;
inc(t);
c[t]:=x;
f[x]:=true;
i:=q[x];
while i<> do
begin
y:=w[i].po;
if not v[y] then
begin
tarjan(y);
low[x]:=min(low[x],low[y]);
end
else if f[y] then low[x]:=min(low[x],low[y]);
i:=w[i].next;
end;
if low[x]=dfn[x] then
begin
inc(s);
while c[t+]<>x do
begin
y:=c[t];
be[y]:=s;
f[y]:=false;
dec(t);
end;
end;
end; procedure sap(s,t:longint);
var q,u,i,j,tmp:longint;
begin
fillchar(c,sizeof(c),);
fillchar(dfn,sizeof(dfn),);
for i:= to t do
cur[i]:=p[i];
u:=s;
dfn[]:=t+;
while c[s]<t+ do
begin
i:=cur[u];
while i<>- do
begin
j:=e[i].po;
if (e[i].flow>) and (c[u]=c[j]+) then
begin
cur[u]:=i;
low[j]:=u;
u:=j;
if u=t then
begin
while u<>s do
begin
u:=low[u];
j:=cur[u];
dec(e[j].flow);
inc(e[j xor ].flow);
end;
end;
break;
end;
i:=e[i].next;
end;
if i=- then
begin
dec(dfn[c[u]]);
if dfn[c[u]]= then exit;
q:=-;
tmp:=t;
i:=p[u];
while i<>- do
begin
j:=e[i].po;
if e[i].flow> then
if c[j]<tmp then
begin
q:=i;
tmp:=c[j];
end;
i:=e[i].next;
end;
cur[u]:=q;
c[u]:=tmp+;
inc(dfn[c[u]]);
if u<>s then u:=low[u];
end;
end;
end; function check:boolean;
var i:longint;
begin
i:=p[ss];
while i<>- do
begin
if (e[i].flow>) and (e[i].po<>t) then exit(false);
i:=e[i].next;
end;
exit(true);
end; begin
readln(te);
while te> do
begin
dec(te);
len:=;
fillchar(p,sizeof(p),);
fillchar(q,sizeof(q),);
readln(n,m,na,nb);
for i:= to na do
read(a[i]);
for i:= to nb do
read(b[i]);
for i:= to m do
begin
readln(x,y);
add(x,y);
end;
fillchar(v,sizeof(v),false);
fillchar(f,sizeof(f),false);
fillchar(c,sizeof(c),);
s:=;
for i:= to n do
if not v[i] then
begin
h:=;
t:=;
tarjan(i);
end;
len:=-;
t:=*s+;
ss:=*s+;
tt:=*s+;
for i:= to na do
begin
build(,be[a[i]],inf);
build(be[a[i]],,);
end;
for i:= to nb do
begin
build(be[b[i]]+s,t,inf);
build(t,be[b[i]]+s,);
end;
for i:= to n do
begin
j:=q[i];
while j<> do
begin
y:=be[w[j].po];
if y<>be[i] then
begin
build(be[i]+s,y,inf);
build(y,be[i]+s,);
end;
j:=w[j].next;
end;
end;
for i:= to s do
begin
build(i,i+s,inf);
build(i+s,i,);
build(ss,i+s,);
build(i+s,ss,);
build(i,tt,);
build(tt,i,);
end;
sap(ss,tt);
build(t,,inf);
build(,t,);
sap(ss,tt);
if check then writeln(e[len].flow)
else writeln('no solution');
end;
end.
bzoj2893的更多相关文章
- 【bzoj2893】征服王
Portal -->bzoj2893 Descripiton 给你一个\(n\)个点\(m\)条边的有向图,有一些点是起始点,有一些点是终止点,一次操作可以从一个起始点开始沿着有向图的边走到一个 ...
- 【BZOJ-2893】征服王 最大费用最大流(带下界最小流)
2893: 征服王 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 156 Solved: 48[Submit][Status][Discuss] D ...
- BZOJ2893: 征服王
题解: 裸的上下界最小流是有问题的.因为在添加了附加源之后求出来的流,因为s,t以及其它点地位都是平等的.如果有一个流经过了s和t,那么总可以认为这个流是从s出发到t的满足题意的流. 既然可能存在s到 ...
- bzoj2893(费用流)
先缩点,然后拆点,其实是很经典的一种操作,把不好做的点拆成边,然后我一开始想的是网络流,答案当然是增广次数, 但可以发现跑网络流的话不同的跑法增广次数不一样,不太好找最小的.我们可以换一种神奇的思路, ...
- BZOJ2893:征服王(费用流)
Description 虽然春希将信息传递给了雪菜,但是雪菜却好像完全不认得春希了.心急如焚的春希打开了第二世代机能,对雪菜的脑内芯片进行了直连-hack. 进入到雪菜内部的春希发现(这什么玩意..) ...
- [bzoj2893] 集合计数
Description 一个有N个元素的集合有2^N 个不同子集(包含空集),现在要在这2^N个集合中取出若干集合(至少一个),使得 它们的交集的元素个数为K,求取法的方案数,答案模100000000 ...
- jbpm4.4 spring整合
jBPM-4.4与Spring集成配置比较容易,这里我使用的是Spring-2.5.6,数据库连接池使用C3P0,将相关的两个jar文件加入到CLASSPATH中. jBPM-4.4与Spring集成 ...
- [转载]hzwer的bzoj题单
counter: 664BZOJ1601 BZOJ1003 BZOJ1002 BZOJ1192 BZOJ1303 BZOJ1270 BZOJ3039 BZOJ1191 BZOJ1059 BZOJ120 ...
- Dubbo 优雅停机演进之路
一.前言 在 『ShutdownHook- Java 优雅停机解决方案』 一文中我们聊到了 Java 实现优雅停机原理.接下来我们就跟根据上面知识点,深入 Dubbo 内部,去了解一下 Dubbo 如 ...
随机推荐
- c语言学习之基础知识点介绍(十二):结构体的介绍
一.结构体的介绍 /* 语法: struct 结构体名{ 成员列表; }; 切记切记有分号! 说明:成员列表就是指你要保存哪些类型的数据. 注意:上面的语法只是定义一个新的类型,而这个类型叫做结构体类 ...
- ios 系统参数用法
qi前言:写一个宏来选择性地编译与运行为不同iOS所写的代码来支持多个版本的ios工程 #if __IPHONE_OS_VERSION_MIN_REQUIRED #import "xxxxx ...
- 10.12_win8风格,把专业书籍当小说看,SQLite
(1)CSS:Metro UI CSS(Metroui) 是一套实现了 Windows 8 的 Metro 风格界面的 CSS 框架..官网.BootMetro . (2)[开源访谈]CecOS作者 ...
- HTML 表单和表格
1.使用表单标签 网站使用 HTML 表单可与用户进行交互,表单元素是允许用户在表单中输入内容,比如:文本框.文本域.单选框.复选框.下拉列表.按钮等等,表单可以把浏览者输入的数据传送到服务器端,这样 ...
- hbuilder工具快捷键 http://www.qq210.com/shoutu/android
http://www.qq210.com/shoutu/android 创建HTML结构: h 8 (敲h激活代码块列表,按8选择第8个项目,即HTML代码块,或者敲h t Enter)中途换行: ' ...
- Python深入学习笔记(一)
写在前面的话 从08年接触Python到现在,断断续续地使用,到如今Python已经成为日常事物处理.科研实验,甚至工程项目的主力语言,主要因为其敏捷性和快速实现的能力.虽然看了一些Python的教程 ...
- JDOM
JDOM是什么: To provide a complete, Java-based solution for accessing, manipulating, and outputting XML ...
- 一个matlab数字图像处理程序的解释
clc; %clc是清除command window里的内容 clear all; %clear是清除workspace里的变量 close all; %close all来关闭所有已经打开的图像窗口 ...
- ubuntu中vi在编辑状态下方向键不能用的解决
ubuntu中vi在编辑状态下方向键不能用,还有回格键不能删除等,我们平时习惯的一些键都不能使用. 解决办法: 可以安装vim full版本,在full版本下键盘正常,安装好后同样使用vi命令. 安装 ...
- JavaScript模块化开发实例
最近接触了一些JavaScript开发的例子,在这里与大家一起分享一下: 例子:当我们一个团队在写Js文件的时候,你一个人写的JS代码自己可以看懂也可以维护,但是别人想对你的JS进行扩展的话,如果都在 ...