看不懂题解以及别人说的集合最多只有一个点。。。。。

然后试了下题解的方法http://blog.sina.com.cn/s/blog_6bddecdc0102uzka.html

首先是无源汇有上下界最大流:就是最大流基础上,无源汇,每条边的流量有上下界。

这题是给一个图,V<=200,E<=5000,每条边有destroy[i][j]和build[i][j]。选一个非空点集S,令T为S的补集。若max{∑D[s][t]-D[t][s]-B[t][s]}<=0输出happy否则输出unhappy,其中s,t是点集S,点集T的结点。

转换的推导证明可以看题解链接。这里不说多成累赘。

对于无源汇有上下界最大流的解法如下http://blog.csdn.net/z309241990/article/details/38531655

上界用ci表示,下界用bi表示。

下界是必须流满的,那么对于每一条边,去掉下界后,其自由流为ci– bi。

主要思想:每一个点流进来的流=流出去的流

对于每一个点i,令

Mi= sum(i点所有流进来的下界流)– sum(i点所有流出去的下界流)

如果Mi大于0,代表此点必须还要流出去Mi的自由流,那么我们从源点连一条Mi的边到该点。

如果Mi小于0,代表此点必须还要流进来Mi的自由流,那么我们从该点连一条Mi的边到汇点。

如果求S->T的最大流,看是否满流(S的相邻边都流满)。

满流则有解,否则无解。

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <cmath>
using namespace std; // sap
#define mxn 222
#define mxe 10100 const int INF = 2100000000;
struct SAP{
int dis[mxn], pre[mxn], gap[mxn], arc[mxn], f[mxe], cap[mxe];
int head[mxn], nxt[mxe], vv[mxe], e;
void init(){e=0;memset(head,-1,sizeof(head));}
void add(int u,int v,int c) {
vv[e] = v, cap[e] = c, nxt[e] = head[u], head[u] = e++;
vv[e] = u, cap[e] = 0, nxt[e] = head[v], head[v] = e++;
}
int max_flow( int s, int t, int n ) {
int q[mxn], j, mindis, ans = 0, ht = 0, tl = 1, u, v, low;
bool found, vis[mxn];
memset( dis, 0, sizeof(dis) );
memset( gap, 0, sizeof(gap) );
memset( vis, 0, sizeof(vis) );
memset( arc, -1, sizeof(arc) );
memset( f, 0, sizeof(f) );
q[0] = t; vis[t] = true; dis[t] = 0; gap[0] = 1;
while( ht < tl ) {
u = q[ht++];
for( int i = head[u]; i != -1; i = nxt[i] ) {
v = vv[i];
if( !vis[v] ) {
vis[v] = true;
dis[v] = dis[u] + 1;
q[tl++] = v;
gap[dis[v]]++;
arc[v] = head[v];
}
}
}
u = s; low = INF; pre[s] = s;
while( dis[s] < n ) {
found = false;
for( int &i = arc[u]; i != -1; i = nxt[i] )
if( dis[vv[i]] == dis[u]-1 && cap[i] > f[i] ) {
found = true; v = vv[i];
low = min(low, cap[i]-f[i]);
pre[v] = u; u = v;
if( u == t ) {
while( u != s ) {
u = pre[u];
f[arc[u]] += low;
f[arc[u]^1] -= low;
}
ans += low; low = INF;
}
break;
}
if( found )
continue;
mindis = n;
for(int i = head[u]; i != -1; i = nxt[i] ) {
if( mindis > dis[vv[i]] && cap[i] > f[i] ) {
mindis = dis[vv[j = i]];
arc[u] = i;
}
}
gap[dis[u]]--;
if( gap[dis[u]] == 0 ) return ans;
dis[u] = mindis + 1;
gap[dis[u]]++;
u = pre[u];
}
return ans;
}
}net; int low[222];
int main(){
int t,n,m,ca=0;
scanf("%d",&t);
while(t--){
printf("Case #%d: ",++ca);
scanf("%d%d",&n,&m);
net.init();
memset(low,0,sizeof low );
for(int i=0;i<m;++i){
int u,v,d,b;
scanf("%d%d%d%d",&u,&v,&d,&b);
low[u]-=d;
low[v]+=d;
net.add(u,v,b);
}
int ans=0;
for(int i=1;i<=n;++i){
if(low[i]>0) net.add(0,i,low[i]), ans+=low[i];
if(low[i]<0) net.add(i,n+1,-low[i]);
}
int mf = net.max_flow(0,n+1,n+2);
if(mf==ans)puts("happy");
else puts("unhappy");
}
return 0;
}

  

HDU 4940 Destroy Transportation system(无源汇有上下界最大流)的更多相关文章

  1. hdu 4940 Destroy Transportation system( 无源汇上下界网络流的可行流推断 )

    题意:有n个点和m条有向边构成的网络.每条边有两个花费: d:毁坏这条边的花费 b:重建一条双向边的花费 寻找这样两个点集,使得点集s到点集t满足 毁坏全部S到T的路径的费用和 > 毁坏全部T到 ...

  2. HDU 4940 Destroy Transportation system(无源汇上下界网络流)

    Problem Description Tom is a commander, his task is destroying his enemy’s transportation system. Le ...

  3. HDU 4940 Destroy Transportation system(2014 Multi-University Training Contest 7)

    思路:无源汇有上下界可行流判定, 原来每条边转化成  下界为D  上界为 D+B   ,判断是否存在可行流即可. 为什么呢?  如果存在可行流  那么说明对于任意的 S 集合流出的肯定等于 流入的, ...

  4. hdu 4940 无源汇有上下界最大流

    /* <img src="http://img.blog.csdn.net/20140823174212937?watermark/2/text/aHR0cDovL2Jsb2cuY3N ...

  5. LOJ [#115. 无源汇有上下界可行流](https://loj.ac/problem/115)

    #115. 无源汇有上下界可行流 先扔个板子,上下界的东西一点点搞,写在奇怪的合集里面 Code: #include <cstdio> #include <cstring> # ...

  6. 2018.08.20 loj#115. 无源汇有上下界可行流(模板)

    传送门 又get到一个新技能,好兴奋的说啊. 一道无源汇有上下界可行流的模板题. 其实这东西也不难,就是将下界变形而已. 准确来说,就是对于每个点,我们算出会从它那里强制流入与流出的流量,然后与超级源 ...

  7. [loj#115] 无源汇有上下界可行流 网络流

    #115. 无源汇有上下界可行流 内存限制:256 MiB时间限制:1000 ms标准输入输出 题目类型:传统评测方式:Special Judge 上传者: 匿名 提交提交记录统计讨论测试数据   题 ...

  8. loj#115. 无源汇有上下界可行流

    \(\color{#0066ff}{ 题目描述 }\) 这是一道模板题. \(n\) 个点,\(m\) 条边,每条边 \(e\) 有一个流量下界 \(\text{lower}(e)\) 和流量上界 \ ...

  9. 【LOJ115】无源汇有上下界可行流(模板题)

    点此看题面 大致题意: 给你每条边的流量上下界,让你判断是否存在可行流.若有,则还需输出一个合法方案. 大致思路 首先,每条边既然有一个流量下界\(lower\),我们就强制它初始流量为\(lower ...

随机推荐

  1. 安装使用ubuntu和opensuse

    liquid: n.液体, adj. 液体的, 流动的 liquidate: v. 清洗; 清算; 变现; 杀戮; weird: [wi2d] e:i, ir:2 离奇的,古怪的... 英文名称, 直 ...

  2. 几个Web server的HA架构资料

    提高Web性能, 最关键还是要看瓶颈在哪里. 手段不外乎下面几个. 实现从易到难一般为: 优化Big SQL -> 引入CDN -> 引入Memcache等缓存 -> Web负载平衡 ...

  3. [PHP知识点乱炖]四、全局变量——小偷从良记

    本章要讲的是PHP的全局变量. 这里讲个小故事: 很多年前,一个很聪明的小偷,想去偷一户人家的钱.可是他偷不到主人的钥匙,怎么办呢? 他想到了一个办法,去之前嚼了一块口香糖,口香糖的牌子是“大大泡泡糖 ...

  4. C语言:break和continue

    break: break用于循环则是终止循环,break如果用于switch,则是用于终止switch.break不能直接用于if,除非if是属于循环内部的一个子句 ;i<;i++) { > ...

  5. CentOS 6.5 zabbix 3.0.4 乱码问题

    中文支持 修改web端源文件来开启语言 [root@localhost /]# vim /var/www/html/zabbix/include/locales.inc.php 'zh_CN' =&g ...

  6. html5 图片转为base64格式异步上传

    因为有这个需求(移动端),所以就研究了一下,发现还挺不错的.这个主要是用了html5的API,不需要其他的JS插件,不过只有支持html5的浏览器才行,就现在而言应该大部份都支持的.<!DOCT ...

  7. BZOJ3172——[Tjoi2013]单词

    1. 题目大意:一篇论文是由许多单词组成,现在想知道每个单词分别在论文中出现多少次. 2.分析:对着 广义后缀自动机的图看,我们就会发现玄机,答案不就是这个单词下的后缀个数吗? 于是建立自动机,然后求 ...

  8. 关闭MyEclipse Derby服务

    MyEclipse的Servers视图出现 MyEclipse Derby服务,一直想把它去掉在网上搜索了下,现已解决. 如下,MyEclipse菜单:window-->Preferences- ...

  9. 9 DelayQueueEntry 延时队列节点类——Live555源码阅读(一)基本组件类

    这是Live555源码阅读的第一部分,包括了时间类,延时队列类,处理程序描述类,哈希表类这四个大类. 本文由乌合之众 lym瞎编,欢迎转载 http://www.cnblogs.com/oloroso ...

  10. String封装——读时共享,写时复制

    碰到过一位一直怀疑C++标准库(STL)效率的人,他说STL效率太低,企业开发根本不会用.我是持反对意见的. 说这话的人,肯定没有做过大量的调查.没有调查就没有发言权. STL的效率是不低的,足够满足 ...