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 如 ...
随机推荐
- 关于GC进行垃圾回收的时机
前言 今天查看一个同事的代码,发现代码中多处地方使用了GC.Collect()方法,我问他为什么这么做,他说感觉程序中定义了好多变量,怕GC回收不及时,用GC.Collect()可以手动掌控GC进行垃 ...
- 使用RequireJS优化Web应用前端
require.js官网:http://requirejs.org/docs/download.html 一篇不错的文章:http://www.csdn.net/article/2012-09-27/ ...
- PDF编译出现错误解决办法
今天在编译PDF时发现使用了一下STL中的z数值极限<Numeric Limits>竟然编译不过, return GetRangeConstraint(value <= std::n ...
- 第14章高级IO总结
1 低速系统调用 可能使进程永远阻塞的一类系统调用,包括: 1)读某些文件类型(管道.终端.网络设备)的数据 2)写某些文件类型(管道.终端.网络设备),但数据不能被立即接受(管道中无空间.流量控制等 ...
- docker 中搭建tomcat
关于docker中tomcat的搭建,没有什么多说的,直接下载官方镜像 docker pull tomcat (可能会下载到好几个镜像,就是tag不同,有知道为什么的可以告诉我) 然后我看的 ht ...
- php内存管理
1.为什么需要内存管理 由于计算机的内存由操作系统进行管理,所以普通应用程序是无法直接对内存进行访问的, 应用程序只能向操作系统申请内存,通常的应用也是这么做的,在需要的时候通过类似malloc之类的 ...
- MySql 在大数量的统计中具体的使用技巧
一.CASE WHEN THEN ELSE END 使用用法. 在用sql语句统计某字段的某种状态的出现的次数,可以考虑用到 CASE WHEN THEN ELSE END 使用用法.当数据量过于庞大 ...
- 设置Android程序的默认安装位置
修改 AndroidManifest.xml 文件: <manifest xmlns:android="http://schemas.android.com/apk/res/andro ...
- oracle安装,配置,启动
因为主要不是讲oracle这些,所以就略写. 注意安装的时候:确保以前安装过的卸载干净了.安装的路径不能包含中文.安装的时候需要创建两层数据库.因为在选择的安装目录的平行目录会产生文件. 确认卸载完可 ...
- 分享自己动手弄的基于Rime的新世纪五笔输入法码表
实验室新搞了一台iMac,没有支持新世纪的码表的中文输入法啊.搜索半天大家推荐用Rime(鼠须管)来挂接新世纪码表.不知道还有没有其它支持外挂码表的Mac版输入法,暂时只有搞这个了.看了一下别人已经做 ...