BZOJ2893: 征服王
题解:
裸的上下界最小流是有问题的。
因为在添加了附加源之后求出来的流,因为s,t以及其它点地位都是平等的。
如果有一个流经过了s和t,那么总可以认为这个流是从s出发到t的满足题意的流。
既然可能存在s到t的流,那么也可能会存在不经过s和t的流,而这是一条环流!!起点不是s,也不是t!显然不满足题意!!!
为了避免环流的出现,我们只好缩点。。。(本来想偷懒不缩的。。。)
所以整个算法就是缩点之后上下界最小流。
代码:无压力rank1了。。。
#include<cstdio> #include<cstdlib> #include<cmath> #include<cstring> #include<algorithm> #include<iostream> #include<vector> #include<map> #include<set> #include<queue> #include<string> #define inf 1000000000 #define maxn 100000+5 #define maxm 100000+5 #define eps 1e-10 #define ll long long #define pa pair<int,int> #define for0(i,n) for(int i=0;i<=(n);i++) #define for1(i,n) for(int i=1;i<=(n);i++) #define for2(i,x,y) for(int i=(x);i<=(y);i++) #define for3(i,x,y) for(int i=(x);i>=(y);i--) #define for4(i,x) for(int i=head[x],y;i;i=e[i].next) #define mod 1000000007 using namespace std; inline int read() { int x=,f=;char ch=getchar(); while(ch<''||ch>''){if(ch=='-')f=-;ch=getchar();} while(ch>=''&&ch<=''){x=*x+ch-'';ch=getchar();} return x*f; }
int n,m,s,t,ss,tt,T,a[maxn],b[maxn],maxflow,tot=,head[maxn],cur[maxn],h[maxn],in[maxn];
queue<int>q;
struct edge{int go,next,v;}e[maxm];
inline void add(int x,int y,int v)
{
e[++tot]=(edge){y,head[x],v};head[x]=tot;
e[++tot]=(edge){x,head[y],};head[y]=tot;
}
inline void ins(int x,int y)
{
e[++tot]=(edge){y,head[x],};head[x]=tot;
}
inline void insert(int x,int y,int l,int r)
{
in[y]+=l;in[x]-=l;add(x,y,r-l);
}
void build()
{
for0(i,tt)if(in[i]>)add(ss,i,in[i]);else if(in[i]<)add(i,tt,-in[i]);
}
bool bfs()
{
for(int i=;i<=tt;i++)h[i]=-;
q.push(s);h[s]=;
while(!q.empty())
{
int x=q.front();q.pop();
for(int i=head[x];i;i=e[i].next)
if(e[i].v&&h[e[i].go]==-)
{
h[e[i].go]=h[x]+;q.push(e[i].go);
}
}
return h[t]!=-;
}
int dfs(int x,int f)
{
if(x==t) return f;
int tmp,used=;
for(int i=cur[x];i;i=e[i].next)
if(e[i].v&&h[e[i].go]==h[x]+)
{
tmp=dfs(e[i].go,min(e[i].v,f-used));
e[i].v-=tmp;if(e[i].v)cur[x]=i;
e[i^].v+=tmp;used+=tmp;
if(used==f)return f;
}
if(!used) h[x]=-;
return used;
}
void dinic()
{
maxflow=;
while(bfs())
{
for (int i=;i<=tt;i++)cur[i]=head[i];maxflow+=dfs(s,inf);
}
}
int ti,u[maxn],v[maxn],low[maxn],dfn[maxn],cnt,scc[maxn],top,sta[maxn];
int minflow()
{
s=ss;t=tt;
dinic();
if(maxflow!=cnt)return -;
int ans=e[tot].v;
e[tot].v=e[tot^].v=;
s=cnt+cnt+;t=;
dinic();
return ans-maxflow;
}
inline void tarjan(int x)
{
sta[++top]=x;low[x]=dfn[x]=++ti;
for4(i,x)if(!dfn[y=e[i].go])
{
tarjan(y);
low[x]=min(low[x],low[y]);
}else if(!scc[y])low[x]=min(low[x],dfn[y]);
if(low[x]==dfn[x])
{
cnt++;
for(int y=;y!=x;)scc[y=sta[top--]]=cnt;
}
} int main() { freopen("input.txt","r",stdin); freopen("output.txt","w",stdout); T=read();
while(T--)
{
memset(head,,sizeof(head));tot=;cnt=;
memset(in,,sizeof(in));
memset(low,,sizeof(low));
memset(dfn,,sizeof(dfn));
memset(scc,,sizeof(scc));
n=read();m=read();a[]=read();b[]=read();
for1(i,a[])a[i]=read();
for1(i,b[])b[i]=read();
for1(i,m){u[i]=read();v[i]=read();ins(u[i],v[i]);}
for1(i,n)if(!dfn[i])tarjan(i);
s=;t=cnt+cnt+;ss=t+;tt=t+;
memset(head,,sizeof(head));tot=;
for1(i,cnt)insert(i,i+cnt,,inf);
for1(i,a[])insert(s,scc[a[i]],,inf);
for1(i,b[])insert(scc[b[i]]+cnt,t,,inf);
for1(i,m)if(scc[u[i]]!=scc[v[i]])insert(scc[u[i]]+cnt,scc[v[i]],,inf);
build();
insert(t,s,,inf);
int x=minflow();
if(x==-)printf("no solution\n");else printf("%d\n",x);
} return ; }
2893: 征服王
Time Limit: 10 Sec Memory Limit: 256 MB
Submit: 64 Solved: 17
[Submit][Status]
Description
process中,要想使雪菜回到正常状态,需要纳米机器人的帮助。纳米机器人可以从任意一个可以作为起点的块落出发进行修复,也可以在任意一个可以作为
终点的块落结束修复(并不是到了某个终点就一定要停止)。春希希望所有的节点都能被修复(只要纳米机器人到过该点就算修复过),这样才能让雪菜重获新生。
Input
Output
Sample Input
2 1 1 1
1
2
2 1
3 2 3 3
1 2 3
1 2 3
1 2
1 3
Sample Output
2
【数据规模和约定】
对于30%的数据,满足n <= 10, m <= 100。
对于60%的数据,满足n <= 200, m <= 5000。
对于100%的数据,满足t<=10,n <= 1000, m <= 10000。
BZOJ2893: 征服王的更多相关文章
- BZOJ2893:征服王(费用流)
Description 虽然春希将信息传递给了雪菜,但是雪菜却好像完全不认得春希了.心急如焚的春希打开了第二世代机能,对雪菜的脑内芯片进行了直连-hack. 进入到雪菜内部的春希发现(这什么玩意..) ...
- 【BZOJ-2893】征服王 最大费用最大流(带下界最小流)
2893: 征服王 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 156 Solved: 48[Submit][Status][Discuss] D ...
- 【bzoj2893】征服王
Portal -->bzoj2893 Descripiton 给你一个\(n\)个点\(m\)条边的有向图,有一些点是起始点,有一些点是终止点,一次操作可以从一个起始点开始沿着有向图的边走到一个 ...
- SDOI2017 Round1
SDOI2017 Round1 在回去的车上写的 cnblog的markdown貌似有bug,空行都没有了 Day -several [清明节] 没想到在省选之前还会有一次放假 放假前一天晚上走到校门 ...
- bzoj AC倒序
Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...
- 安晓辉大神的感悟:如果你发现了自己的学习模式,愿意学并且能坚持,我觉得没什么能阻挡你征服软件世界的脚步(对于开发人员来讲,最大的风险是:在职业规划上没有延续性地乱跳槽。时刻要牢记在心的:培养自己的稀缺性) good
从技术支持中途转战软件开发,如今从事编程工作已十多有余,2014年CSDN博文大赛编程语言组冠军.CSDN Qt论坛的版主安晓辉老师从今天开始,坐镇CSDN社区问答栏目的 第十四期,届时会接受广大网友 ...
- 彻底征服 Spring AOP 之 理论篇
基本知识 其实, 接触了这么久的 AOP, 我感觉, AOP 给人难以理解的一个关键点是它的概念比较多, 而且坑爹的是, 这些概念经过了中文翻译后, 变得面目全非, 相同的一个术语, 在不同的翻译下, ...
- BZOJ 4008 【HNOI2015】 亚瑟王
题目链接:亚瑟王 这道题好神啊TAT--果然我的dp还是太弱了-- 一开始想了半天的直接dp求期望,结果最后WA的不知所云-- 最后去翻了题解,然后发现先算概率,再求期望--新姿势\(get\). 我 ...
- Bzoj4008 [HNOI2015]亚瑟王
Time Limit: 20 Sec Memory Limit: 512 MBSec Special Judge Submit: 1009 Solved: 605[Submit][Status] ...
随机推荐
- GridView分页排序
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="GridviewPage.asp ...
- Vi 几个实用的命令
vi有三种工作模式:指令模式.编辑模式和命令模式. 我们从打开vi说起,这样可以确定下学习环境,也方便学习者实践.打开vi,当前模式即为指令模式,此时可以按a, i, 或o进入编辑模式,或按:(冒号) ...
- sql查找最小缺失值与重用被删除的键(转载)
转载自:http://blog.csdn.net/yanghua_kobe/article/details/6262550 在数据处理时,我们经常会使用一些“自增”的插入方式来处理数据.比如学生学号: ...
- css tricks
http://css-tricks.com/styling-cross-browser-compatible-range-inputs-css/ http://css-tricks.com/brows ...
- 关于Eigen库在Visual Studio2013中传参对齐报错问题
Error as follow: 具体问题及解决办法描述如下: (引自http://www.fx114.net/qa-278-97757.aspx) /************************ ...
- 阿里云Ubuntu服务器安装java环境
一.下载jdk wget --no-check-certificate --no-cookies --header "Cookie: oraclelicense=accept-secureb ...
- Windows 7下载
原版的ISO:windows 7 旗舰版:32位: ed2k://|file|cn_windows_7_ultimate_x86_dvd_x15-65907.iso|2604238848|D6F139 ...
- 实时数据处理环境搭建flume+kafka+storm:2.flume 安装
1. 解压 tar -zxvf 2.配置 拷贝配置文件 :cp flume-conf.properties.template flume-conf.properties ...
- 【linux程序设计4th】第三章1
makefile .PHONY:clean all CC=gcc CFLAGS=-Wall -g ###replace your bin BIN=simple_write simple_read co ...
- 分享SCI写作经验和一些工具