题意:n个点,m条边,每条边有容量限制 l--c,每个点满足容量平衡(流入等于流出),求可行解

无源无汇可行流问题,建立以一个超级源点和超级汇点,由于原来最大流问题时候,流量下界其实为0,

所以要转化,把边(设u-->v)的容量改为c-l,但是这样不平衡了,所以S流入v点l,u点流出到T要l,这样

保证了u,v流量平衡,用数组sumin[i]记录下i点流入下限之和,最后超级源点流入i。

最后求一次s-->t的最大流(走一遍dinic),如果添加的边都满流,说明有解(此时每条边所用流量+下限即可),

反之无解(必需要满流,否则不遵循流量平衡条件!)。(无源无汇模型和参考黑书

p366)。

#include<iostream>   //15ms
#include<cstdio>
#include<vector>
#include<queue>
using namespace std;
int n,m;const int inf=0x3f3f3f3f;
int e[90000][5];int head[210]; //链前星存边,0:to,1:pre,2,残量;3:l(下界);4,c
int sum_in[210];int sum_out[210]; //点i流入之和,流出之和
int vis[210];int level[210];
bool bfs() //dinic,小心细节!要熟练
{
for(int i=0;i<=n+1;i++)
vis[i]=level[i]=0;
queue<int>q;q.push(0);vis[0]=1;
while(!q.empty())
{
int cur=q.front();q.pop();
for(int i=head[cur];i!=-1;i=e[i][1])
{
int v=e[i][0];
if(!vis[v]&&e[i][2]>0)
{
level[v]=level[cur]+1;
if(v==n+1)return 1;
vis[v]=1;
q.push(v);
}
}
}
return vis[n+1];
}
int dfs(int u,int minf)
{
if(u==n+1||minf==0){return minf;}
int sumf=0,f;
for(int i=head[u];i!=-1&&minf;i=e[i][1])
{ int v=e[i][0];
if(level[v]==level[u]+1&&e[i][2]>0)
{
f=dfs(v,minf<e[i][2]?minf:e[i][2]);
if(f<=0)continue;
e[i][2]-=f;e[i^1][2]+=f;
sumf+=f;minf-=f;
}
}
return sumf;
}
void dinic()
{ int sumflow=0;
while(bfs())
{
sumflow+=dfs(0,inf);
}
}
bool check() //判断有无解
{
for(int i=head[0];i!=-1;i=e[i][1]) //所有从超级源点出来的流量必满,否则无解!
if(e[i][2]!=0)return 0; //满必然有解,无需再判断汇点是否满(重复了)
// int v=n; //起初多此一举判断汇点满流情况,但是要注意一点
// for(int i=head[n+1];i!=-1;i=e[i][1]) //边遍历顺序,前向星是前一条边,按添加时顺序相反
// if(e[i][2]!=sum_out[v--])return 0;//添加迟,出现早。
return 1;
}
int main()
{
while(~scanf("%d%d",&n,&m))
{
for(int i=0;i<=n+1;i++)
{
head[i]=-1;
sum_in[i]=sum_out[i]=0;
}
int a,b,l,c; int nume=0;
for( ;nume<2*m;) //读入,用每条边e[i][2]流量是残量,其他无用,只是保存起来,输出时用一下
{
scanf("%d%d%d%d",&a,&b,&l,&c);
e[nume][0]=b;e[nume][1]=head[a];head[a]=nume;
e[nume][4]=c;e[nume][3]=l;e[nume++][2]=c-l;
sum_in[b]+=l;sum_out[a]+=l;
e[nume][0]=a;e[nume][1]=head[b];head[b]=nume;
e[nume++][2]=0;
}
for(int i=1;i<=n;i++)
{
e[nume][0]=i;e[nume][1]=head[0];head[0]=nume;
e[nume++][2]=sum_in[i];
e[nume][0]=0;e[nume][1]=head[i];head[i]=nume;
e[nume++][2]=0;
e[nume][0]=n+1;e[nume][1]=head[i];head[i]=nume;
e[nume++][2]=sum_out[i];
e[nume][0]=i;e[nume][1]=head[n+1];head[n+1]=nume;
e[nume++][2]=0;
}
dinic();
if(!check())printf("NO\n");
else
{
printf("YES\n");
for(int i=0;i<2*m;i+=2)
{
printf("%d\n",e[i][4]-e[i][2]);
}
}
}
return 0;
}

SGU 194 无源无汇可行流求解的更多相关文章

  1. sgu 194 Reactor Cooling(有容量上下界的无源无汇可行流)

    [题目链接] http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=20757 [题意] 求有容量上下界的无源无汇可行流. [思路] ...

  2. sgu 194 上下界网络流可行流判定+输出可行流

    #include <cstdio> #include <cstring> #define min(a,b) ((a)<(b)?(a):(b)) #define oo 0x ...

  3. 【HDU 4940】Destroy Transportation system(无源无汇带上下界可行流)

    Description Tom is a commander, his task is destroying his enemy’s transportation system. Let’s repr ...

  4. [ACdream 1211 Reactor Cooling]无源无汇有上下界的可行流

    题意:无源无汇有上下界的可行流 模型 思路:首先将所有边的容量设为上界减去下界,然后对一个点i,设i的所有入边的下界和为to[i],所有出边的下界和为from[i],令它们的差为dif[i]=to[i ...

  5. ZOJ 1314 Reactor Cooling | 上下界无源汇可行流

    ZOJ 1314 Reactor Cooling | 上下界无源汇可行流 题意 有一个网络,每条边有流量的上界和下界,求一种方案,让里面的流可以循环往复地流动起来. 题解 上下界无源汇可行流的模型: ...

  6. ZOJ 2314 Reactor Cooling | 无源汇可行流

    题目: 无源汇可行流例题 http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=1314 题解: 证明什么的就算了,下面给出一种建图方式 ...

  7. 算法复习——无源汇可行流(zoj2314)

    题目: The terrorist group leaded by a well known international terrorist Ben Bladen is buliding a nucl ...

  8. 【BZOJ-2055】80人环游世界 上下界费用流 (无源无汇最小费用最大流)

    2055: 80人环游世界 Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 321  Solved: 201[Submit][Status][Discus ...

  9. SGU 194 Reactor Cooling Dinic求解 无源无汇有上下界的可行流

    题目链接 题意:有向图中有n(1 <= n <= 200)个点,无自环或者环的节点个数至少为3.给定每条边的最小流量和最大流量,问每条边的可行流量为多少? 思路:一般求解的网络流并不考虑下 ...

随机推荐

  1. UML建模图实战笔记

    一.前言 UML:Unified Modeling Language(统一建模语言),使用UML进行建模的作用有哪些: 可以更好的理解问题 可以及早的发现错误或者被遗漏的点 可以更加方便的进行组员之间 ...

  2. 记 thoughtworks 的一次面试

    2015年的1月30号,星期五.我将要去thoughtworks面试. 最早听说thoughtworks是在学校听同学说起的.一句不经意间的引导可能会改变我的整个人生. 实话说,我之前对thought ...

  3. 用户授权policy

    定义策略类 php artisan make:policy PostPolicy app/Policies/PostPolicy.php public function update(User $us ...

  4. 远程桌面连接windowsServer

    1.win+R 打开windows运行工具栏: 2.输入 mstsc ,确定: 3.登录设置: 计算机:目标服务器ip地址:用户名:管理员或者用户的用户名,例如:administrator:密码:账户 ...

  5. COGS 2111. [NOIP2015普及]扫雷游戏

    ★   输入文件:2015mine.in   输出文件:2015mine.out   简单对比时间限制:1 s   内存限制:256 MB [题目描述] 扫雷游戏是一款十分经典的单机小游戏.在 n 行 ...

  6. 第二周作业xml学习情况

    1.xml简介 可扩展标记语言是一种很像超文本标记语言的标记语言. 它的设计宗旨是传输数据,而不是显示数据. 它的标签没有被预定义.您需要自行定义标签. 它被设计为具有自我描述性. 它是W3C的推荐标 ...

  7. 应用程序员眼中的数据库管理系统:API+数据库语言

    应用程序员眼中的数据库管理系统:API+数据库语言 sqlite3_open_v2 https://www.cnblogs.com/cchust/p/5121559.html

  8. 7-Java-C(冰雹数)

    题目描述: 任意给定一个正整数N, 如果是偶数,执行: N / 2 如果是奇数,执行: N * 3 + 1 生成的新的数字再执行同样的动作,循环往复. 通过观察发现,这个数字会一会儿上升到很高, 一会 ...

  9. Django 路由 —— Djangon如何处理一个请求

    Django URL路由概述 一个干净优雅的URL方案是高质量Web应用程序中的一个重要细则Django可以让你设计URL,无论你想要什么,没有框剪限制要为应用程序设计URL,您可以非正式地创建一个名 ...

  10. Graveyard LA3708

    白书第一章例题4 思维. 先固定一点不动,假设最后一共N个点,那么编号为0,1,...N-1, 0不动,原来的n个点分别占据i/n*N的位置(记为pos),移动到pos四舍五入的位置即可. 证明一:有 ...