题意:

      给你一个强连通图,然后问你是否可以找到任意满足条件的集合S,S是非空集合,T是S的补集,满足sum(D[i ,j]) <= sum(D[j,i] + B[j,i]) i属于S集合,j属于T集合(其实也就暗示了i,j是S,T的割边)。

思路:

       无源汇上下流可行流判断问题,首先题目给的图是一个强连通图,为了方便理解,我们假设这个图只有两个点,a,b,那么肯定也只有两条边,a->b ,b->a,那么我们可以直接建边a->b(下界 D 上界 B + D) b->a(下界 D 上界 B + D)这样跑一遍上下流之后如果存在可行流,那么就存在一个a,b之间的循环流(循环流的大小我们不用关心,我们只关心是否存在),那么就会有这样的结论,a->b的D(下限)一定小于等于b->a
的D+B(上限),同时 b->a的D(下限) 一定小于等于a->b的 D+B(上限),所以无论是a,还是b都可以充当S集合。so如果整个图中任意两个集合都这样就显然可以满足题意了。


#include<stdio.h>
#include<string.h>
#include<queue> #define N_node 220
#define N_edge 33000
#define INF 1000000000

using namespace
std; typedef struct
{
int
to ,next ,cost;
}
STAR; typedef struct
{
int
x ,t;
}
DEP; STAR E[N_edge];
DEP xin ,tou;
int
list[N_node] ,listt[N_node] ,tot;
int
deep[N_node] ,sum_must; void add(int a ,int b ,int c)
{

E[++tot].to = b;
E[tot].cost = c;
E[tot].next = list[a];
list[a] = tot; E[++tot].to = a;
E[tot].cost = 0;
E[tot].next = list[b];
list[b] = tot;
} void
ADD(int a ,int b ,int c ,int d ,int ss ,int tt)
{

add(a ,b ,d - c);
add(a ,tt ,c);
add(ss ,b ,c);
sum_must += c;
} int
minn(int x ,int y)
{
return
x < y ? x : y;
} bool
BFS_Deep(int s ,int t ,int n)
{

xin.x = s ,xin.t = 0;
queue<DEP>q;
q.push(xin);
memset(deep ,255 ,sizeof(deep));
deep[s] = 0;
while(!
q.empty())
{

tou = q.front();
q.pop();
for(int
k = list[tou.x] ;k ;k = E[k].next)
{

xin.x = E[k].to;
xin.t = tou.t + 1;
if(
deep[xin.x] != -1 || !E[k].cost)
continue;

deep[xin.x] = xin.t;
q.push(xin);
}
}
for(int
i = 0 ;i <= n ;i ++)
listt[i] = list[i];
return
deep[t] != -1;
} int
DFS_Flow(int s ,int t ,int flow)
{
if(
s == t) return flow;
int
nowflow = 0;
for(int
k = listt[s] ;k ;k = E[k].next)
{

listt[s] = k;
int
to = E[k].to;
int
c = E[k].cost;
if(
deep[to] != deep[s] + 1 || !c)
continue;
int
tmp = DFS_Flow(to ,t ,minn(c ,flow - nowflow));
nowflow += tmp;
E[k].cost -= tmp;
E[k^1].cost += tmp;
if(
nowflow == flow)
break;
}
if(!
nowflow) deep[s] = 0;
return
nowflow;
} int
DINIC(int s ,int t ,int n)
{
int
ans = 0;
while(
BFS_Deep(s ,t ,n))
{

ans += DFS_Flow(s ,t ,INF);
}
return
ans;
} int main ()
{
int
t ,n ,m ,i ,a ,b ,c ,d ,cas = 1;
scanf("%d" ,&t);
while(
t--)
{

scanf("%d %d" ,&n ,&m);
int
ss = 0 ,tt = n + 1;
memset(list ,0 ,sizeof(list));
tot = 1 ,sum_must = 0;
for(
i = 1 ;i <= m ;i ++)
{

scanf("%d %d %d %d" ,&a ,&b ,&c ,&d);
ADD(a ,b ,c ,c + d ,ss ,tt);
}

printf("Case #%d: " ,cas ++);
sum_must == DINIC(ss ,tt ,tt) ? puts("happy") : puts("unhappy");
}
return
0;
}

hdu4940 有上下界的无源可行流判断的更多相关文章

  1. ZOJ2314 Reactor Cooling(无源汇流量有上下界网络的可行流)

    题目大概说一个核反应堆的冷却系统有n个结点,有m条单向的管子连接它们,管子内流量有上下界的要求,问能否使液体在整个系统中循环流动. 本质上就是求一个无源汇流量有上下界的容量网络的可行流,因为无源汇的容 ...

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

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

  3. BZOJ 3876 支线剧情 有源汇有上下界最小费用可行流

    题意: 给定一张拓扑图,每条边有边权,每次只能从第一个点出发沿着拓扑图走一条路径,求遍历所有边所需要的最小边权和 分析: 这道题乍一看,可能会想到什么最小链覆盖之类的,但是仔细一想,会发现不行,一是因 ...

  4. BZOJ 2055 80人环游世界 有上下界最小费用可行流

    题意: 现在有这么一个m人的团伙,也想来一次环游世界. 他们打算兵分多路,游遍每一个国家.    因为他们主要分布在东方,所以他们只朝西方进军.设从东方到西方的每一个国家的编号依次为1...N.假若第 ...

  5. zoj 3229 上下界网络最大可行流带输出方案

    收获: 1. 上下界网络流求最大流步骤: 1) 建出无环无汇的网络,并看是否存在可行流 2) 如果存在,那么以原来的源汇跑一次最大流 3) 流量下界加上当前网络每条边的流量就是最大可行流了. 2. 输 ...

  6. POJ2396 Budget(有源汇流量有上下界网络的可行流)

    题目大概给一个有n×m个单元的矩阵,各单元是一个非负整数,已知其每行每列所有单元的和,还有几个约束条件描述一些单元是大于小于还是等于某个数,问矩阵可以是怎样的. 经典的流量有上下界网络流问题. 把行. ...

  7. POJ 2396 Budget (上下界网络流有源可行流)

    转载: http://blog.csdn.net/axuan_k/article/details/47297395 题目描述: 现在要针对多赛区竞赛制定一个预算,该预算是一个行代表不同种类支出.列代表 ...

  8. sgu 176 上下界网络流最小可行流带输出方案

    算法步骤: 1. 先将原图像最大可行流那样变换,唯一不同的是不加dst->src那条边来将它变成无源无汇的网络流图.直接跑一边超级源到超级汇的最大流. 2. 加上刚才没有加上的那条边p 3. 再 ...

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

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

随机推荐

  1. HDOJ-6681(离散化+线段树)

    Rikka With Cake HDOJ-6681 最终的答案为射线的交点数加一.当然,我们也可以证明.证明需要用到欧拉公式 V−E+F=2 V-E+F=2V−E+F=2 .设射线的交点共 c cc ...

  2. 洛谷P3285 [SCOI2014]方伯伯的OJ 动态开点平衡树

    洛谷P3285 [SCOI2014]方伯伯的OJ 动态开点平衡树 题目描述 方伯伯正在做他的 \(Oj\) .现在他在处理 \(Oj\) 上的用户排名问题. \(Oj\) 上注册了 \(n\) 个用户 ...

  3. React函数式组件和类组件[Dan]

    一篇对Dan的 How Are Function Components Different from Classes? 一文的个人阅读总结,内容来自于此.强烈推荐阅读 Dan Abramov.的博客. ...

  4. 记一次 mysql主从复制安装配置 过程

    mysql主从复制安装配置 1.centos安装及准备 去centos官网下载相应source版本的镜像文件并在vmware中安装,安装中会遇到填写installation source,输入以下即可 ...

  5. POJ_1227 Jack Straws 【二维平面判两线段相交】

    一 题面 POJ1127 二 分析 在平面几何中,判断两线段相交的方法一般是使用跨立实验.但是这题考虑了非严格相交,即如何两个线段刚好端点相交则也是相交的,所以还需要使用快速排斥实验. 这里参考并引用 ...

  6. polay计数原理

    公式: Burnside引理: 1/|G|*(C(π1)+C(π2)+C(π3)+.....+C(πn)): C(π):指不同置换下的等价类数.例如π=(123)(3)(45)(6)(7),X={1, ...

  7. Poj3660(floyd)

    题目传送门 题意:编号为1-N的奶牛参加比赛,告诉我们m场比赛结果试问有几头奶牛的排名可以确定. 题解:其实就是一个传递闭包的模板题,用Floyd把所有有联系的比赛结果串在一起. Ac 代码: #in ...

  8. C++并发与多线程学习笔记--参数传递详解

    传递临时对象 陷阱 总结 临时对象作为线程参数 线程id的概念 临时对象构造时的抓捕 成员函数指针做线程函数 传递临时对象作为线程参数 创建的工作线程不止一个,线程根据编号来确定工作内容.每个线程都需 ...

  9. js 日期加减

    加: console.log(moment().format("YYYY-MM-DD HH:mm:ss")); //当前时间 console.log(moment().add(10 ...

  10. 北航OO第三单元作业总结(3.1~3.3)

    JML简介及相关工具链使用 1.JML规格描述语言介绍 本单元学习的内容是JML规格描述语言.我们知道,面向对象方法是一个抽象过程,需求者仅需关注方法的规格.规格是对一个方法/类/程序的外部可感知行为 ...