有起点终点的限制的路径覆盖
首先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的更多相关文章

  1. 【bzoj2893】征服王

    Portal -->bzoj2893 Descripiton 给你一个\(n\)个点\(m\)条边的有向图,有一些点是起始点,有一些点是终止点,一次操作可以从一个起始点开始沿着有向图的边走到一个 ...

  2. 【BZOJ-2893】征服王 最大费用最大流(带下界最小流)

    2893: 征服王 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 156  Solved: 48[Submit][Status][Discuss] D ...

  3. BZOJ2893: 征服王

    题解: 裸的上下界最小流是有问题的.因为在添加了附加源之后求出来的流,因为s,t以及其它点地位都是平等的.如果有一个流经过了s和t,那么总可以认为这个流是从s出发到t的满足题意的流. 既然可能存在s到 ...

  4. bzoj2893(费用流)

    先缩点,然后拆点,其实是很经典的一种操作,把不好做的点拆成边,然后我一开始想的是网络流,答案当然是增广次数, 但可以发现跑网络流的话不同的跑法增广次数不一样,不太好找最小的.我们可以换一种神奇的思路, ...

  5. BZOJ2893:征服王(费用流)

    Description 虽然春希将信息传递给了雪菜,但是雪菜却好像完全不认得春希了.心急如焚的春希打开了第二世代机能,对雪菜的脑内芯片进行了直连-hack. 进入到雪菜内部的春希发现(这什么玩意..) ...

  6. [bzoj2893] 集合计数

    Description 一个有N个元素的集合有2^N 个不同子集(包含空集),现在要在这2^N个集合中取出若干集合(至少一个),使得 它们的交集的元素个数为K,求取法的方案数,答案模100000000 ...

  7. jbpm4.4 spring整合

    jBPM-4.4与Spring集成配置比较容易,这里我使用的是Spring-2.5.6,数据库连接池使用C3P0,将相关的两个jar文件加入到CLASSPATH中. jBPM-4.4与Spring集成 ...

  8. [转载]hzwer的bzoj题单

    counter: 664BZOJ1601 BZOJ1003 BZOJ1002 BZOJ1192 BZOJ1303 BZOJ1270 BZOJ3039 BZOJ1191 BZOJ1059 BZOJ120 ...

  9. Dubbo 优雅停机演进之路

    一.前言 在 『ShutdownHook- Java 优雅停机解决方案』 一文中我们聊到了 Java 实现优雅停机原理.接下来我们就跟根据上面知识点,深入 Dubbo 内部,去了解一下 Dubbo 如 ...

随机推荐

  1. ACM——大数相加

    大数加法 时间限制(普通/Java):1000MS/3000MS          运行内存限制:65536KByte 总提交:2085            测试通过:543 描述 求两个非负整数( ...

  2. 数据库连接池php-cp介绍

    php-cp(php-connect-pool)是用php扩展写的一个数据库连接池. 我们知道php开发速度快,适合创业快速迭代,但当流量大了之后,php大量的短连接给db层造成多余的消耗,而php处 ...

  3. 不同浏览器下css 透明度的写法

    filter:alpha(opacity=90); /* IE transparent */ -moz-opacity:0.9; /* Moz + FF transparent */ opacity: ...

  4. 解压版tomcat设置为系统服务

    1.先关闭tomcat,在"开始 "→"运行 "中输入cmd 命令,进入MS-DOS界面 2.进入 到tomcat的bin目录下 (解压版tomcat存放目录, ...

  5. 【技术·水】浅谈Dism++清理插件开发

    前言 昨天我发布了NCleaner,一款Dism++清理插件(地址:http://bbs.pcbeta.com/viewthread-1692182-1-1.html) 有些人想要我开源NCleane ...

  6. bzoj1231: [Usaco2008 Nov]mixup2 混乱的奶牛

    思路:状压dp,设f[i][j]表示当前已经选出的牛的状态为i,最后一头选出的牛为j的方案数. 然后注意就是初值不能是f[0][i]=1,因为所有牛本来都可以第一个被选中,然而这样一定初值有些牛可能就 ...

  7. MySQL的基本使用

    SQL     DDL:数据定义语言  CREATE DROP ALTER     DML:数据操作语言  SELECT INSERT UPDATE DELETE     DCL:数据控制语言  GR ...

  8. Andriod 中常见错误

    1.Open quote is expected for attribute "android:name" associated with an element type &quo ...

  9. 【实习记】2014-09-26恢复linux下误删的ntfs盘中的文件

        情景,ubuntu下把NTFS格式的盘中的“实习记”文件夹彻底删除了,追毁莫及,粗心觉不是一件好的事情. linux下回复ntfs盘下的文件不能用ext3grep,而使用debugfs命令实在 ...

  10. 将数据库二进制图片导出显示到EPPlus Excel2007中

    1.EPPlus Excel 控件可以参考我的另一篇博客:http://blog.163.com/pei_huiping/blog/static/206573067201281810549984/ 这 ...