SGU 176 Flow construction【有上下界最小流】
正好考到了所以翻一些题来做……猛然发现搞了半个月的网络流却没做两道上下界(不过这种题好像是比较少233)
首先建立超级源汇ss,tt,没限制的边照常连,对于有限制的边(u,v,mn,mx),连接(u,v,ss-tt)和辅助边(ss,v,mn)(u,tt,mn)(实际操作中,对每个点记录一个度就行了,然后正的连ss负的连tt),最后连接(t,s,inf)平衡流量。然后跑最大流,判断方法是所有辅助边是否都满流(或者记录正的度的和sum,直接看sum-dinic()==0即可)。然后记录(t,s)的流量re,删掉(t,s),答案就是ans=re-dinic()
注意有一点,这个ans可能是负的,说明(t,s)和某些边形成了环,可以连接(ss,s,-ans),跑以ss为源点,t为汇点的最大流。(这种情况下ans就是0了)
至于输出方案,如果是限制边就是流量上界+这条边的流量,否则就直接是边的流量。
#include<iostream>
#include<cstdio>
#include<queue>
#include<cstring>
using namespace std;
const int N=105,inf=1e9;
int n,m,h[N],cnt=1,s,t,du[N],le[N],ans[N*N],sum;
struct qwe
{
int ne,no,to,va,id;
}e[N*N];
int read()
{
int r=0,f=1;
char p=getchar();
while(p>'9'||p<'0')
{
if(p=='-')
f=-1;
p=getchar();
}
while(p>='0'&&p<='9')
{
r=r*10+p-48;
p=getchar();
}
return r*f;
}
void add(int u,int v,int w,int id)
{
cnt++;
e[cnt].ne=h[u];
e[cnt].no=u;
e[cnt].to=v;
e[cnt].va=w;
e[cnt].id=id;
h[u]=cnt;
}
void ins(int u,int v,int l,int r,int id)
{
du[u]-=l,du[v]+=l;
if(r-l)
{
add(u,v,r-l,0);
add(v,u,0,id);
}
}
bool bfs()
{
queue<int>q;
memset(le,0,sizeof(le));
q.push(s);
le[s]=1;
while(!q.empty())
{
int u=q.front();
q.pop();
for(int i=h[u];i;i=e[i].ne)
if(e[i].va>0&&!le[e[i].to])
{
le[e[i].to]=le[u]+1;
q.push(e[i].to);
}
}
return le[t];
}
int dfs(int u,int f)
{
if(u==t||!f)
return f;
int us=0;
for(int i=h[u];i&&us<f;i=e[i].ne)
if(e[i].va>0&&le[e[i].to]==le[u]+1)
{
int t=dfs(e[i].to,min(e[i].va,f-us));
e[i].va-=t;
e[i^1].va+=t;
us+=t;
}
if(!us)
le[u]=-1;
return us;
}
int dinic()
{
int re=0;
while(bfs())
re+=dfs(s,inf);
return re;
}
int main()
{
n=read(),m=read();
s=0,t=n+1;
for(int i=1;i<=m;i++)
{
int u=read(),v=read(),z=read(),c=read();
ins(u,v,c?z:0,z,i);
if(c)
ans[i]=z;
}
for(int i=1;i<=n;i++)
{
if(du[i]>0)
ins(s,i,0,du[i],0),sum+=du[i];
else
ins(i,t,0,-du[i],0);
}
ins(n,1,0,inf,0);
sum-=dinic();
if(sum)
{
puts("Impossible");
return 0;
}
int re=e[cnt].va;
s=n,t=1;
e[cnt].va=e[cnt^1].va=0;
int an=re-dinic();
if(an<0)
{
s=0;t=n;
ins(s,1,0,-an,0);
dinic();
an=0;
}
printf("%d\n",an);
for(int i=1;i<=cnt;i++)
if(e[i].id)
ans[e[i].id]+=e[i].va;//,cout<<e[i].id<<endl;
for(int i=1;i<=m;i++)
printf("%d ",ans[i]);
return 0;
}
SGU 176 Flow construction【有上下界最小流】的更多相关文章
- Flow construction SGU - 176 有源汇有上下界最小流 二分法和回流法
/** 题目:Flow construction SGU - 176 链接:https://vjudge.net/problem/SGU-176 题意: 有源汇有上下界的最小流. 给定n个点,m个管道 ...
- sgu 176 Flow construction(有源汇的上下界最小流)
[题目链接] http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=11025 [模型] 有源汇点的上下界最小流.即既满足上下界又满足 ...
- SGU 176 Flow construction (有源有汇有上下界最小流)
题意:给定 n 个点,m 条有向边,如果有向边的标号是1的话,就表示该边的上界下界都为容量 ,如果有向边的标号为0的哈,表示该边的下界为0,上界为容量 ,现在问,从 1 到 n 的最小流是多少,并输出 ...
- BZOJ_2502_清理雪道_有源汇上下界最小流
BZOJ_2502_清理雪道_有源汇上下界最小流 Description 滑雪场坐落在FJ省西北部的若干座山上. 从空中鸟瞰,滑雪场可以看作一个有向无环图,每条弧代表一个斜坡(即雪道), ...
- 【Loj117】有源汇上下界最小流(网络流)
[Loj117]有源汇上下界最小流(网络流) 题面 Loj 题解 还是模板题. #include<iostream> #include<cstdio> #include< ...
- loj #117. 有源汇有上下界最小流
题目链接 有源汇有上下界最小流,->上下界网络流 注意细节,边数组也要算上后加到SS,TT边. #include<cstdio> #include<algorithm> ...
- LOJ.117.[模板]有源汇有上下界最小流(Dinic)
题目链接 有源汇有上下界最小流 Sol1. 首先和无源汇网络流一样建图,求SS->TT最大流: 然后连边(T->S,[0,INF]),再求一遍SS->TT最大流,答案为新添加边的流量 ...
- BZOJ1458:士兵占领(有上下界最小流)
Description 有一个M * N的棋盘,有的格子是障碍.现在你要选择一些格子来放置一些士兵,一个格子里最多可以放置一个士兵,障碍格里不能放置士兵.我们称这些士兵占领了整个棋盘当满足第i行至少放 ...
- HDU 3157 Crazy Circuits (有源汇上下界最小流)
题意:一个电路板,上面有N个接线柱(标号1~N) 还有两个电源接线柱 + - 然后是 给出M个部件正负极的接线柱和最小电流,求一个可以让所有部件正常工作的总电流. 析:这是一个有源汇有上下界的 ...
- hdu3157有源汇上下界最小流
题意:有源汇上下界最小流裸题,主要就是输入要用字符串的问题 #include<bits/stdc++.h> #define fi first #define se second #defi ...
随机推荐
- ASP.NET Core小技巧
设定开发环境为开发模式,呈现具体错误内容 dotnet run启动时,会在环境变量中查找ASPNETCORE_ENVIRONMENT变量的值,如果没有,则默认会当做Production来处理,隐藏错误 ...
- 某考试 T1 至危警告
题目大意就是: 设f(x)为x各个位数字之和,求x属于[0,k]且b * f(x)^a + c = x的x个数并升序输出. (a<=5 . b,c,<=10^4 . k<= ...
- Maven创建项目时出现Generating project in Interactive mode就一直卡住的解决方案
使用maven命令在创建项目的时候出现 Generating project in Interactive mode 然后就一直卡住 网上搜做了很多解决方案 有说各种方案的,最后找到了一种.实验成功 ...
- [BLE--Physical Layer]
简述 BLE的物理层,可能做IC或板极硬件RF測试的会比較关注. 是偏硬件层面的. 频率带宽和信道分配 BLE工作于2.4 GHz ISM频段2400-2483.5 MHz,ISM频段是公用的,不须要 ...
- Linux命令chattr和lsattr
先看字面解释: chattr:chattr - change file attributes on a Linux file system lsattr - list file attributes ...
- CentOS 6.x Radius
CentOS 6.x Radius 一. 实现环境: 1.系统:CentOS release 6.6 (Final) 2.需要软件包: 1) freeradius-2.1.12-6.e16.x ...
- powerdesign导出SQL时自己主动生成凝视
1.使用脚本的方式 在里面执行 Option Explicit ValidationMode = True InteractiveMode = im_Batch Dim mdl ' ...
- MySQL Study之--MySQL用户及权限管理
MySQL Study之--MySQL用户及权限管理 MySQLserver通过MySQL权限表来控制用户对数据库的訪问.MySQL权限表存放在mysql数据库里.由mysql_install ...
- How to get service execuable path
Some time we need to get specific service path and then do something you want. there are 2 way to ge ...
- C语言的各种位运算符的操作简述
运算符: 算术运算符: + , - , * , / , % , ++ , -- 符合运算符: += , *= , /= , %= 条件运算符: ? : 关系运算符: == , >= , < ...