AC_Dream 1211 Reactor Cooling
/*
题意:无源无汇,并且每条边的容量有上下界限的网络流问题!既然无源无汇,那么素有的节点都应该满足“入流==出流”!
输出每一条边的流量,使得满足上面的条件。(如果u->v有流量,那么v->u就不会有流量) 思路:如果增加了源点s和汇点t,对于u->v(下限为l, 上限为f) 将这一条边拆成3条,s->v(容量为l), u->v(容量为f-l)
u->t(容量为l)这样就变成了每一个点的流入或者流出的流量至少是b!然后从s->t走一遍最大流,如果所有的附件边都已经
满载,则就是所有s->v的边和u->t的边(或者只判断其中一者就可以),那么就存在答案!
*/
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
#include<queue>
#define INF 0x3f3f3f3f
#define N 205
#define M 500000
using namespace std; struct EDGE{
int v, cap, tot, nt, b;
EDGE(){};
EDGE(int v, int cap, int nt, int b) : v(v), cap(cap), nt(nt), b(b), tot(cap){}
}; EDGE edge[M];
int n, m;
int first[N];
int pre[N], d[N];
int sz;
int s, t;
int full, fout; void addEdge(int u, int v, int b, int cap){
edge[sz] = (EDGE(v, cap, first[u],b));
first[u] = sz++;
edge[sz] = (EDGE(u, , first[v], ));
first[v] = sz++; edge[sz] = (EDGE(v, b, first[s], ));
first[s] = sz++;
edge[sz] = (EDGE(s, , first[v], ));
first[v] = sz++; edge[sz] = (EDGE(t, b, first[u], ));
full += b;
first[u] = sz++;
edge[sz] = (EDGE(u, , first[t], ));
first[t] = sz++;
} bool bfs(){
queue<int>q;
memset(d, , sizeof(d));
d[s] = ;
q.push(s);
while(!q.empty()){
int u = q.front(); q.pop();
for(int i = first[u]; ~i; i = edge[i].nt){
int v = edge[i].v;
if(!d[v] && edge[i].cap >){
d[v] = d[u] + ;
q.push(v);
}
}
}
if(d[t] == ) return false;
return true;
} int dfs(int u, int totf){
int ff;
if( u == t) return totf;
int flow = ;
for(int i = first[u]; ~i && totf > flow; i = edge[i].nt){
int v = edge[i].v;
int cap = edge[i].cap;
//流入u节点的当前总的流量为totf,可以得到 u->v1, u->v2, u->v3....这些路径上的最大流的和为flow+=f(u->vi)
//f(u->vi)表示u节点沿着vi节点方向的路径上的最大流;如果u->vi+1的容量为wi+1,那么u->vi+1所允许流过的最大
//的流量就是 min(totf - cost, wi+1)了!
if(d[v] == d[u] + && cap > ){
ff = dfs(v, min(totf - flow, cap));
if(ff){
edge[i].cap -= ff;
edge[i^].cap += ff;
flow += ff;
}
else
d[v] = -;//表示v这个点无法在继续增广下去了
}
}
return flow;//返回从u节点向外流出的最大流量!
} bool Dinic(){
while(bfs())
fout += dfs(, INF);//这一块没想到写成while(dfs())会超时.... if( fout != full) return false;
return true;
} int main(){ scanf("%d%d", &n, &m);
memset(first, -, sizeof(first));
sz = ;
fout = full = ;
s = ; t = n+;
int u, v, l, f;
for(int i = ; i <= m; ++i){
scanf("%d%d%d%d", &u, &v, &l, &f);
addEdge(u, v, l, f-l);
}
if(!Dinic()){
printf("NO\n");
return ;
}
printf("YES\n");
for(int i = ; i <= m; ++i){
int j = (i-)*;
printf("%d\n", edge[j].tot - edge[j].cap + edge[j].b);//输出这条边实际流过的流量+下限
} return ;
}
AC_Dream 1211 Reactor Cooling的更多相关文章
- acdream 1211 Reactor Cooling 【边界网络流量 + 输出流量】
称号:acdream 1211 Reactor Cooling 分类:无汇的有上下界网络流. 题意: 给n个点.及m根pipe,每根pipe用来流躺液体的.单向的.每时每刻每根pipe流进来的物质要等 ...
- [ACdream 1211 Reactor Cooling]无源无汇有上下界的可行流
题意:无源无汇有上下界的可行流 模型 思路:首先将所有边的容量设为上界减去下界,然后对一个点i,设i的所有入边的下界和为to[i],所有出边的下界和为from[i],令它们的差为dif[i]=to[i ...
- ZOJ2314 Reactor Cooling
Reactor Cooling Time Limit: 5 Seconds Memory Limit: 32768 KB Special Judge The terrorist g ...
- zoj Reactor Cooling
Reactor Cooling 无源汇上下界最大流问题. 1.流量平衡. 2.满足上下界 模板题. #include <iostream> #include <queue> # ...
- 【有上下界的网络流】ZOJ2341 Reactor Cooling(有上下界可行流)
Description The terrorist group leaded by a well known international terrorist Ben Bladen is bulidi ...
- ZOJ 1314 Reactor Cooling | 上下界无源汇可行流
ZOJ 1314 Reactor Cooling | 上下界无源汇可行流 题意 有一个网络,每条边有流量的上界和下界,求一种方案,让里面的流可以循环往复地流动起来. 题解 上下界无源汇可行流的模型: ...
- ZOJ 2314 - Reactor Cooling - [无源汇上下界可行流]
题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=2314 The terrorist group leaded by ...
- zoj 2314 Reactor Cooling (无源汇上下界可行流)
Reactor Coolinghttp://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=1314 Time Limit: 5 Seconds ...
- SGU 194 Reactor Cooling(无源无汇上下界可行流)
Description The terrorist group leaded by a well known international terrorist Ben Bladen is bulidin ...
随机推荐
- javaweb学习总结(二十二)——基于Servlet+JSP+JavaBean开发模式的用户登录注册
一.Servlet+JSP+JavaBean开发模式(MVC)介绍 Servlet+JSP+JavaBean模式(MVC)适合开发复杂的web应用,在这种模式下,servlet负责处理用户请求,jsp ...
- python一套完整的事务操作
#coding=utf-8 import sys import MySQLdb class TransferMoney(object): def __init__(self,conn): self.c ...
- 创建Activiti项目
1.创建项目 2.导入Activiti的jar包 项目上右击创建lib文件夹 将jar包复制进lib文件夹 3.导入数据库连接jar包 4.使用代码创建Activiti用来存放流程数据的23张表 pa ...
- 提高D3js力导向图加载速度(转)
过去一段时间曾两次使用了 D3 力导向图来描绘族群关系. http://bl.ocks.org/mbostock/1062288 第一次用的时候不求甚解,交差了事.当时点也不多,很顺利完成了任务.这一 ...
- mybatis connection error Cannot create PoolableConnectionFactory (Access denied for user 'root '@'local
org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.exceptions.Persiste ...
- windows7文件共享
工作组模式下: 参考:http://support.microsoft.com/kb/2533010/zh-cn 1.首先区分网络类型配置文件:家庭网络,工作网络还是公用网络 2.每种类型区分两种文件 ...
- Android 组件系列-----Activity的传值和回传值
在这篇随笔里将讲解Activity的传值和回传值. 一.通过startActivity来进行Activity的传值 在Android中,如果我们要通过一个Activity来启动另一个Activity, ...
- ASP.NET MVC路由规则
1 是从上往下寻找路由规则的 2 如果上面的匹配了,则下面的不会匹配 3 假如域名是www.startpress.cn 路由规则是 routes.MapRoute( name: "Defau ...
- 老王教您怎么做cass7.1 8.0 9.1所有系列的复制狗 加密狗 破解狗
cass7.1 8.0 9.1所有系列的复制狗 加密狗 破解狗本来是出于好奇看到网上有这样的东西,学了下感觉挺简单的,如果你是cass的初学者想仅仅是想学习这个软件,不想花大价格购买正版的,这个是可以 ...
- 【转】关于TCP和UDP协议消息保护边界的介绍
在 socket网络程序中,TCP和UDP分别是面向连接和非面向连接的.因此TCP的socket编程,收发两端(客户端和服务器端)都要有一一成对的 socket,因此,发送端为了将多个发往接收端的包, ...