bzoj2502: 清理雪道(有源汇有上下界最小流)
别说话,自己看,我不会->这里
我这里用的建图方法是先跑一次最大流,连上$(t,s,inf)$之后再跑一遍,然后答案就是之前连的那条边的反向边的流量
据说还有种方法是连上$(t,s,inf)$之后跑一遍,记录这条边反向边流量,再拆掉边以及$ss$和$tt$,然后再跑一次最大流,答案就是之前记录的流量减去这次的流量。亲测差不多
- //minamoto
- #include<iostream>
- #include<cstdio>
- #include<cstring>
- #include<queue>
- #define inf 0x3f3f3f3f
- using namespace std;
- #define getc() (p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin),p1==p2)?EOF:*p1++)
- char buf[<<],*p1=buf,*p2=buf;
- inline int read(){
- #define num ch-'0'
- char ch;bool flag=;int res;
- while(!isdigit(ch=getc()))
- (ch=='-')&&(flag=true);
- for(res=num;isdigit(ch=getc());res=res*+num);
- (flag)&&(res=-res);
- #undef num
- return res;
- }
- const int N=,M=;
- int head[N],Next[M],ver[M],edge[M],tot=;
- int cur[N],dep[N],S,T;
- queue<int> q;
- inline void add(int u,int v,int e){
- ver[++tot]=v,Next[tot]=head[u],head[u]=tot,edge[tot]=e;
- ver[++tot]=u,Next[tot]=head[v],head[v]=tot,edge[tot]=;
- }
- bool bfs(){
- memset(dep,-,sizeof(dep));
- memcpy(cur,head,sizeof(head));
- while(!q.empty()) q.pop();
- q.push(S),dep[S]=;
- while(!q.empty()){
- int u=q.front();q.pop();
- for(int i=head[u];i;i=Next[i]){
- int v=ver[i];
- if(dep[v]<&&edge[i]){
- dep[v]=dep[u]+,q.push(v);
- if(v==T) return true;
- }
- }
- }
- return false;
- }
- int dfs(int u,int limit){
- if(u==T||!limit) return limit;
- int flow=,f;
- for(int i=cur[u];i;cur[u]=i=Next[i]){
- int v=ver[i];
- if(dep[v]==dep[u]+&&(f=dfs(v,min(limit,edge[i])))){
- flow+=f,limit-=f;
- edge[i]-=f,edge[i^]+=f;
- if(!limit) break;
- }
- }
- if(!flow) dep[u]=-;
- return flow;
- }
- int dinic(){
- int flow=;
- while(bfs()) flow+=dfs(S,inf);
- return flow;
- }
- int n,s,t,k[N];
- int main(){
- //freopen("testdata.in","r",stdin);
- n=read();
- for(int i=;i<=n;++i){
- int x=read();
- while(x--){
- int y=read();
- --k[i],++k[y];
- add(i,y,inf);
- }
- }
- s=,t=n+,S=n+,T=n+;
- for(int i=;i<=n;++i)
- add(s,i,inf),add(i,t,inf);
- for(int i=;i<=n;++i)
- k[i]<?add(i,T,-k[i]):add(S,i,k[i]);
- dinic();
- add(t,s,inf);
- dinic();
- printf("%d\n",edge[tot]);
- return ;
- }
bzoj2502: 清理雪道(有源汇有上下界最小流)的更多相关文章
- loj #117. 有源汇有上下界最小流
题目链接 有源汇有上下界最小流,->上下界网络流 注意细节,边数组也要算上后加到SS,TT边. #include<cstdio> #include<algorithm> ...
- LOJ.117.[模板]有源汇有上下界最小流(Dinic)
题目链接 有源汇有上下界最小流 Sol1. 首先和无源汇网络流一样建图,求SS->TT最大流: 然后连边(T->S,[0,INF]),再求一遍SS->TT最大流,答案为新添加边的流量 ...
- sgu 176 Flow construction(有源汇的上下界最小流)
[题目链接] http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=11025 [模型] 有源汇点的上下界最小流.即既满足上下界又满足 ...
- Flow construction SGU - 176 有源汇有上下界最小流 二分法和回流法
/** 题目:Flow construction SGU - 176 链接:https://vjudge.net/problem/SGU-176 题意: 有源汇有上下界的最小流. 给定n个点,m个管道 ...
- bzoj 2502 清理雪道(有源汇的上下界最小流)
[题意] 有一个DAG,要求每条边必须经过一次,求最少经过次数. [思路] 有上下界的最小流. 边的下界为1,上界为无穷.构造可行流模型,先不加ts边跑一遍最大流,然后加上t->s的inf边跑 ...
- 【 POJ - 3801】Crazy Circuits(有源汇、上下界最小流)
Description You’ve just built a circuit board for your new robot, and now you need to power it. Your ...
- sgu176 Flow Construction【有源汇有上下界最小流】
同样是模板题. 首先将有源汇转换为无源汇,假设原来的源汇为st,我们加入的源汇为ST,那么我们应该从t到s连一条流量为+∞的边,使原来的st满足收支平衡,退化为普通节点. 分离必要边和其他边,从S到T ...
- Crazy Circuits HDU - 3157(有源汇有上下界最小流)
给出每条边的下界 求最小流 板题 提供两个板子代码 虽然这个题 第一个比较快 但在loj上https://loj.ac/problem/117 的板题 第一个1700+ms 第二个才600+ms ...
- LOJ117 有源汇有上下界最小流(上下界网络流)
跑出可行流后从原来的汇点向原来的源点跑最大流,原图最小流=inf-maxflow.显然超源超汇的相关边对其也没有影响.原图最小流=可行流-原图新增流量,因为t向s流量增加相当于s向t流量减少.但为什么 ...
随机推荐
- C# 往excel出力数据
/// <summary> /// 出力Excel /// </summary> /// <param name="storeModelForExcel&quo ...
- javaScript-进阶篇(三)
1.Window对象 window对象是BOM的核心,window对象指当前的浏览器窗口. window对象方法: 2.JavaScript 计时器 在JavaScript中,我们可以在设定的时间间隔 ...
- python中的单引号,双引号和三双引号的区别
1.单引号和双引号没有区别.都可以用就是为了方便,减少写太多的转义字符. 比如: str='Let\'s go!' str="Let's go!" 两种等价,但是第二种写法显然更优 ...
- linux命令学习(8):mv命令
版权声明更新:2017-05-12博主:LuckyAlan联系:liuwenvip163@163.com声明:吃水不忘挖井人,转载请注明出处! 1 文章介绍 本文介绍了Linux下面的mv命令. 2. ...
- params 和 query 传参的区别
很多人都知道params 和 query 都可以在页面跳转的时候传递参数. query更加类似于我们ajax中get传参,params则类似于post,说的再简单一点,前者在浏览器地址栏中显示参数 ...
- C#调试信息打印到输出窗口
System.Diagnostics.Debug.WriteLine("aaaa");
- Select\Poll\Epoll异步IO与事件驱动
事件驱动与异步IO 事件驱动编程是一种编程规范,这里程序的执行流由外部事件来规定.它的特点是包含一个事件循环,但外部事件发生时使用回调机制来触发响应的处理.另外两种常见的编程规范是(单线程)同步以及多 ...
- linux下go的动态链接库的使用
转自:http://blog.csdn.net/xtxy/article/details/21328143 在使用lua进行服务器端游戏逻辑开发时,发现了LUA的各种不方便的地方,不能编译检查,不能断 ...
- java基础知识(8)---内部类
内部类:如果A类需要直接访问B类中的成员,而B类又需要建立A类的对象.这时,为了方便设计和访问,直接将A类定义在B类中.就可以了.A类就称为内部类.内部类可以直接访问外部类中的成员.而外部类想要访问内 ...
- JavaScript设模式---单例模式
单例模式也称为单体模式,其中: 1,单体模式用于创建命名空间,将系列关联的属性和方法组织成一个逻辑单元,减少全局变量. 逻辑单元中的代码通过单一的变量进行访问. 2,三个特点: ① 该类只有一个实例: ...