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

时间:2022-09-25 18:09:43
/*
<img src="http://img.blog.csdn.net/20140823174212937?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdTAxMTQ4MzMwNg==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="" />
题意:给出一个有向强连通图,每条边有两个值各自是破坏该边的代价和把该边建成无向边的代价(建立无向边的前提是删除该边)问是否存在一个集合S,和一个集合的补集T,破坏全部S集合到T集合的边代价和是X,然后修复T到S的边为无向边代价和是Y,满足Y<X;满足输出unhappy,否则输出happy;
分析:无源汇有上下界可行流判定, 原来每条边转化成 下界为D 上界为 D+B ,推断是否存在可行流就可以。</span>
假设存在可行流 那么说明对于随意的 S 集合流出的肯定等于 流入的, 流出的计算的 X 肯定小于等于这个流量(X是下界之和), 计算出来的Y (上界之和)肯定大于等于 这个流量 肯定满足X<=Y。
*/
#include<stdio.h>
#include<string.h>
#include<queue>
using namespace std;
#define N 300
#define inf 0x3fffffff
struct node {
int u,v,w,next;
}bian[N*N*3];
int head[N],yong,dis[N],work[N];
void init(){
yong=0;
memset(head,-1,sizeof(head));
}
void addbian(int u,int v,int w) {
bian[yong].u=u;
bian[yong].v=v;
bian[yong].w=w;
bian[yong].next=head[u];
head[u]=yong++;
}
void add(int u,int v,int w) {
addbian(u,v,w);
addbian(v,u,0);
}
int min(int a,int b)
{
return a<b?a:b;
}
int bfs(int s,int t)
{
memset(dis,-1,sizeof(dis));
queue<int>q;
q.push(s);
dis[s]=0;
while(!q.empty())
{
int u=q.front();
q.pop();
for(int i=head[u];i!=-1;i=bian[i].next)
{
int v=bian[i].v;
if(bian[i].w&&dis[v]==-1)
{
dis[v]=dis[u]+1;
q.push(v);
if(v==t)
return 1;
}
}
}
return 0;
}
int dfs(int s,int limit,int t)
{
if(s==t)return limit;
for(int &i=work[s];i!=-1;i=bian[i].next)
{
int v=bian[i].v;
if(bian[i].w&&dis[v]==dis[s]+1)
{
int tt=dfs(v,min(limit,bian[i].w),t);
if(tt)
{
bian[i].w-=tt;
bian[i^1].w+=tt;
return tt;
}
}
}
return 0;
}
int dinic(int s,int t)
{
int ans=0;
while(bfs(s,t))
{
memcpy(work,head,sizeof(head));
while(int tt=dfs(s,inf,t))
ans+=tt;
}
return ans;
}
int main(){
int sum,a,b,c,T,d,ans,i,k=0,n,m,t,S,w[N];
scanf("%d",&t);
while(t--) {
init();
scanf("%d%d",&n,&m);
S=0;T=n+1;
memset(w,0,sizeof(w));
for(i=1;i<=m;i++) {
scanf("%d%d%d%d",&a,&b,&c,&d);
add(a,b,d);
w[b]+=c;
w[a]-=c;
}
sum=0;
for(i=1;i<=n;i++) {
if(w[i]>0) {
sum+=w[i];
add(S,i,w[i]);
}
if(w[i]<0)
add(i,T,-w[i]);
}
ans=dinic(S,T);
if(sum==ans)
printf("Case #%d: happy\n",++k);
else
printf("Case #%d: unhappy\n",++k);
} return 0;
}

hdu 4940 无源汇有上下界最大流的更多相关文章

  1. HDU 4940 Destroy Transportation system(无源汇有上下界最大流)

    看不懂题解以及别人说的集合最多只有一个点..... 然后试了下题解的方法http://blog.sina.com.cn/s/blog_6bddecdc0102uzka.html 首先是无源汇有上下界最 ...

  2. LOJ &lbrack;&num;115&period; 无源汇有上下界可行流&rsqb;&lpar;https&colon;&sol;&sol;loj&period;ac&sol;problem&sol;115&rpar;

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

  3. 2018&period;08&period;20 loj&num;115&period; 无源汇有上下界可行流(模板)

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

  4. &lbrack;loj&num;115&rsqb; 无源汇有上下界可行流 网络流

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

  5. loj&num;115&period; 无源汇有上下界可行流

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

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

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

  7. Zoj 2314 Reactor Cooling(无源汇有上下界可行流)

    http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=1314 题意:    给n个点,及m根pipe,每根pipe用来流躺液体的,单向 ...

  8. ZOJ 2314 &lpar;sgu 194&rpar; Reactor Cooling &lpar;无源汇有上下界最大流&rpar;

    题意: 给定n个点和m条边, 每条边有流量上下限[b,c], 求是否存在一种流动方法使得每条边流量在范围内, 而且每个点的流入 = 流出 分析: 无源汇有上下界最大流模板, 记录每个点流的 in 和 ...

  9. LibreOJ &num;115&period; 无源汇有上下界可行流

    二次联通门 : LibreOJ #115. 无源汇有上下界可行流 /* LibreOJ #115. 无源汇有上下界可行流 板子题 我也就会写写板子题了.. */ #include <cstdio ...

随机推荐

  1. mac 关闭&amp&semi;&amp&semi;显示隐藏文件命令

    打开终端,输入: defaults write com.apple.finder AppleShowAllFiles -bool true 此命令显示隐藏文件 defaults write com.a ...

  2. SQL Server数据库性能优化之SQL语句篇【转】

    SQL Server数据库性能优化之SQL语句篇http://www.blogjava.net/allen-zhe/archive/2010/07/23/326927.html 近期项目需要, 做了一 ...

  3. datatables ajax后端请求那些坑

    在对datatables做后端数据填充的时候,遇到一个,翻页问题.在多次操作翻页后,总是提示加载中.反了很多博客没有找到原因. 经过测试,发现原来自己坑了自己. 代码如下: datatables : ...

  4. Java反射深入浅出(一)

    在JVM中对一个类实例的创建,有两种方式,一种是编译时,一种是运行时.两种方式在开发过程中都是十分重要的.在Java中无时无刻无处不在的Java对象,实例化的过程也就变得尤为引人瞩目.我们经常用new ...

  5. php中的字符串常用函数&lpar;三&rpar; str&lowbar;replace&lpar;&rpar; 子字符串替换

    mixed str_replace ( mixed $search , mixed $replace , mixed $subject [, int &$count ] ); 该函数返回一个字 ...

  6. C语言的函数

    "函数"在英文的翻译是"function",无论在自然科学还是计算机科学都是这个词,而"function"的本意是"功能&quot ...

  7. Posix 信号量

    作用 信号量的值为0或正整数,就像红灯与绿灯,用于指示当前是否可以接受任务. 信号量对进程和线程都适用. gcc编译时需加-lpthread 基本函数 信号量的相关函数与标准文件函数非常相似,可以理解 ...

  8. 实验-hadoop新增节点

    关于hadoop新增节点网上的说法都有些差别,自己来实践一把 1.建立一个namenode一个datanode的集群 master:192.168.126.130 slave1:192.168.126 ...

  9. filter&lpar;&rpar;和find&lpar;&rpar;的区别

    <div class="css"> <p class="rain">测试1</p> </div> <div ...

  10. 矩阵游戏&lpar;game&rpar;

    矩阵游戏(game) --九校联考24OI__D1T1 问题描述 LZK发明一个矩阵游戏,大家一起来玩玩吧,有一个N行M列的矩阵.第一行的数字是1,2,-M,第二行的数字是M+1,M+2-2*M,以此 ...