SGU176 Flow construction
http://acm.sgu.ru/problem.php?contest=0&problem=176
有源汇上下界最小流,可以选择跟有源汇上下界最大流一样的建图方式,然后用二分去二分t->s这条边的流量,最小的可行流就是答案。
也可以这样:
跟无源汇最大流建图一样,然后不添加t->s的边
对ss->tt求最大流,然后添加t->s的边,求ss->tt最大流,若是满流,则t->s的流量就是最小流
PS:记录一下:SGU的ID是068720
第二种建图方式:
- #include<cstdio>
- #include<cmath>
- #include<algorithm>
- #include<cstring>
- #include<iostream>
- #define inf 0x7fffffff
- const int maxn=;
- const int maxe=maxn*maxn+;
- int tot,go[maxe],first[maxn],next[maxe],flow[maxe];
- int op[maxe],id[maxe],n,m,du[maxn],cnt[maxn],dis[maxn];
- int dn[maxe];
- int read(){
- int t=,f=;char ch=getchar();
- while (ch<''||ch>''){if (ch=='-') f=-;ch=getchar();}
- while (''<=ch&&ch<=''){t=t*+ch-'';ch=getchar();}
- return t*f;
- }
- void insert(int x,int y,int z){
- tot++;
- go[tot]=y;
- next[tot]=first[x];
- first[x]=tot;
- flow[tot]=z;
- }
- void add(int x,int y,int z){
- insert(x,y,z);op[tot]=tot+;
- insert(y,x,);op[tot]=tot-;
- }
- int dfs(int x,int f,int S,int T,int nodes){
- if (x==T) return f;
- int mn=nodes,sum=;
- for (int i=first[x];i;i=next[i]){
- int pur=go[i];
- if (flow[i]&&dis[pur]+==dis[x]){
- int F=std::min(f-sum,flow[i]);
- int save=dfs(pur,F,S,T,nodes);
- flow[i]-=save;
- flow[op[i]]+=save;
- sum+=save;
- if (f==sum||dis[S]>=nodes) return sum;
- }
- if (flow[i]) mn=std::min(mn,dis[pur]);
- }
- if (sum==){
- cnt[dis[x]]--;
- if (cnt[dis[x]]==) dis[S]=nodes;
- else {
- dis[x]=mn+;
- cnt[dis[x]]++;
- }
- }
- return sum;
- }
- int mxflow(int S,int T,int nodes){
- int res=;
- for (int i=;i<=nodes;i++) cnt[i]=dis[i]=;
- while (dis[S]<nodes) res+=dfs(S,inf,S,T,nodes);
- return res;
- }
- int main(){
- int s,t;
- n=read();m=read();
- s=;t=n+;
- for (int i=;i<=m;i++){
- int u=read(),v=read(),c=read(),pd=read();
- if (pd){
- du[u]-=c;
- du[v]+=c;
- add(u,v,);
- dn[i]=c;id[i]=tot;
- }else{
- add(u,v,c);
- dn[i]=;id[i]=tot;
- }
- }
- int sum=;
- for (int i=;i<=n;i++)
- if (du[i]<) add(i,t,-du[i]);
- else add(s,i,du[i]),sum+=du[i];
- int sum1=mxflow(s,t,t+);
- add(n,,inf);
- int sum2=mxflow(s,t,t+);
- int sx=;
- for (int i=first[s];i;i=next[i]){
- if (flow[i]){
- puts("Impossible");
- return ;
- }
- }
- printf("%d\n",flow[tot]);
- for (int i=;i<=m;i++)
- printf("%d ",flow[id[i]]+dn[i]);
- return ;
- }
SGU176 Flow construction的更多相关文章
- sgu176 Flow Construction【有源汇有上下界最小流】
同样是模板题. 首先将有源汇转换为无源汇,假设原来的源汇为st,我们加入的源汇为ST,那么我们应该从t到s连一条流量为+∞的边,使原来的st满足收支平衡,退化为普通节点. 分离必要边和其他边,从S到T ...
- Flow construction SGU - 176 有源汇有上下界最小流 二分法和回流法
/** 题目:Flow construction SGU - 176 链接:https://vjudge.net/problem/SGU-176 题意: 有源汇有上下界的最小流. 给定n个点,m个管道 ...
- sgu Flow construction
Flow construction 题目: 给出N个节点M条水管,要求在满足上下界的情况下.满足起点最小的流量. 算法: 这是最小流????不知道.仅仅知道用求解上下界最大流的方法就过了. 做这题收获 ...
- SGU 176 Flow construction(有源汇上下界最小流)
Description 176. Flow construction time limit per test: 1 sec. memory limit per test: 4096 KB input: ...
- sgu 176 Flow construction(有源汇的上下界最小流)
[题目链接] http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=11025 [模型] 有源汇点的上下界最小流.即既满足上下界又满足 ...
- SGU 176.Flow construction (有上下界的最大流)
时间限制:0.5s 空间限制:4M 题意: 有一个由管道组成的网络,有n个节点(n不大于100),1号节点可以制造原料,最后汇集到n号节点.原料通过管道运输.其中有一些节点有管道连接,这些管道都有着最 ...
- SGU 176 Flow construction (有源有汇有上下界最小流)
题意:给定 n 个点,m 条有向边,如果有向边的标号是1的话,就表示该边的上界下界都为容量 ,如果有向边的标号为0的哈,表示该边的下界为0,上界为容量 ,现在问,从 1 到 n 的最小流是多少,并输出 ...
- SGU 176 Flow construction【有上下界最小流】
正好考到了所以翻一些题来做--猛然发现搞了半个月的网络流却没做两道上下界(不过这种题好像是比较少233) 首先建立超级源汇ss,tt,没限制的边照常连,对于有限制的边(u,v,mn,mx),连接(u, ...
- Kuangbin 带你飞专题十一 网络流题解 及模版 及上下界网络流等问题
首先是几份模版 最大流:虽然EK很慢但是优势就是短.求最小割的时候可以根据增广时的a数组来判断哪些边是割边.然而SAP的最大流版我只会套版,并不知道该如何找到这个割边.在尝试的时候发现了一些问题.所以 ...
随机推荐
- Codeforces 509C Sums of Digits
http://codeforces.com/contest/509/problem/C 题目大意: 给出一个序列,代表原序列对应位置数的每一位的数字之和,原序列单调递增,问原序列的最后一个数最小的方 ...
- poj3164 (朱刘算法 最小树形图)
题目大意:给定n个点坐标,m条有向边,要求最小树形图. 题解:直接上模板,前面打的 vis[v]=i一直把i打成1,一直TLE. #include<iostream> #include&l ...
- Unity中的关节
关节组件一共分为5大类,它们分别是链条关节.固定关节.弹簧关节.角色关节和可配置关节.链条关节(Hinge Joint):将两个物体以链条的形式绑在一起,当力量过大超过链条的固定力矩时,两个物体就会产 ...
- Android去除系统自带动画的两种方法
方法一: 在startActivity()或者finish()后紧跟调用: ((Activity) mContext).overridePendingTransition(0, 0); 方法二: 在一 ...
- CPU使用率统计办法
我们在搞性能测试的时候,对后台服务器的CPU利用率监控是一个常用的手段.服务器的CPU利用率高,则表明服务器很繁忙.如果前台响应时间越来越大,而后台CPU利用率始终上不去,说明在某个地方有瓶颈了,系统 ...
- 网络测试工具netperf
Netperf是一种网络性能的测量工具,主要针对基于TCP或UDP的传输.Netperf根据应用的不同,可以进行不同模式的网络性能测试,即批量数据传输(bulk data transfer)模式和请求 ...
- 实现简单的django上传文件
本文用django实现上传文件并保存到指定路径下,没有使用forms和models,步骤如下: 1.在模板中使用form表单,因为这个表单使用于上传文件的,所以method属性必须设置为post,而且 ...
- [CSAPP笔记][第二章信息的表示和处理]
信息的表示和处理 2.1 信息存储 机器级程序将存储器视为一个非常大的字节数组,称为虚拟存储器. 存储器的每个字节由一个唯一的数字表示,称为它的地址 所有可能地址的集合称为虚拟地址空间 2.1.1 十 ...
- 普通用户之间的ssh无密码访问设置方法
两台CentOS6.2服务器,客户端是node1,服务器是node2,先都用root用户配置,方法如下: 第一步:在客户端Node1:生成密匙对,我用的是rsa的密钥.使用命令 "ssh-k ...
- Asp.Net HttpApplication请求管道与Session(一)
1.请求处理顺序执行事件 /********************请求处理顺序执行事件**********************/ /// <summary> /// 请求入站 /// ...