UVa 10330 - Power Transmission(最大流--拆点)
http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=1271
题目:普通的网络流模型加多了一个每个节点的流量限制。
刚开始的时候是直接找增广路,顺便更新节点的容量,但是证明不了其正确性,WA了,大概这种做法是错的。
正解:将每个点拆成两个点,并且这两个点构成的边的容量是该点容量,这样就保证流过的流量不大于该点容量。
/*
*Author: Zhaofa Fang
*Created time: 2013-07-16-20.00
*Language: C++
*/
#include <cstdio>
#include <cstdlib>
#include <sstream>
#include <iostream>
#include <cmath>
#include <cstring>
#include <algorithm>
#include <string>
#include <utility>
#include <vector>
#include <queue>
#include <map>
#include <set>
using namespace std; typedef long long ll;
#define DEBUG(x) cout<< #x << ':' << x << endl
#define FOR(i,s,t) for(int i = (s);i <= (t);i++)
#define FORD(i,s,t) for(int i = (s);i >= (t);i--)
#define REP(i,n) for(int i=0;i<(n);i++)
#define REPD(i,n) for(int i=(n-1);i>=0;i--)
#define PII pair<int,int>
#define PB push_back
#define MP make_pair
#define ft first
#define sd second
#define lowbit(x) (x&(-x))
#define INF (1<<30)
#define eps 1e-8 const int maxn = ;
const int maxm = ;
struct Edge{
int v,cap,flow,next;
}edge[maxm];
int eh[maxn],tot;
bool vist[maxn];
int d[maxn]; void init(){
tot = ;
memset(eh,-,sizeof(eh));
}
void addedge(int u,int v,int c){
Edge e = {v,c,,eh[u]};
edge[tot] = e;
eh[u] = tot ++;
}
void add(int u,int v,int c){
addedge(u,v,c);
addedge(v,u,);
}
bool BFS(int s,int t){
memset(vist,,sizeof(vist));
queue<int>Q;
Q.push(s);
vist[s] = ;
d[s] = ;
while(!Q.empty()){
int u = Q.front();
Q.pop();
for(int i=eh[u];i!=-;i=edge[i].next){
int v = edge[i].v;
if(!vist[v] && edge[i].cap > edge[i].flow){
vist[v] = ;
d[v] = d[u] + ;
Q.push(v);
if(v == t)return true;
}
}
}
return false;
}
int DFS(int u,int t,int avi){
if(u == t || avi == )return avi;
int flow = ,f;
for(int i=eh[u];i!=-;i=edge[i].next){
int v = edge[i].v;
if(d[v] == d[u]+ && (f=DFS(v,t,min(avi,edge[i].cap-edge[i].flow)))>){
edge[i].flow += f;
edge[i^].flow -= f;
flow += f;
avi -= f;
if(avi == )break;
}
}
return flow;
}
int maxFlow(int s,int t){
int flow = ;
while(BFS(s,t)){
flow += DFS(s,t,INF);
}
return flow;
}
int main(){
//freopen("in","r",stdin);
//freopen("out","w",stdout);
int n;
while(~scanf("%d",&n)){
int u,v,c,m;
init();
REP(i,n){
scanf("%d",&c);
add(i+,n+i+,c);
}
scanf("%d",&m);
while(m--){
scanf("%d%d%d",&u,&v,&c);
add(n+u,v,c);
}
int B,D;
scanf("%d%d",&B,&D);
while(B--){
scanf("%d",&u);
add(,u,INF);
}
while(D--){
scanf("%d",&u);
add(n+u,*n+,INF);
}
printf("%d\n",maxFlow(,*n+));
}
return ;
}
UVa 10330 - Power Transmission(最大流--拆点)的更多相关文章
- UVa 10330 Power Transmission / 最大流
最大流 这题有很多起点和终点 在取2个点(0和n+1) 作为唯一的起点和终点 此外每个点也有容量限制 建图时每条边上的容量为这条边和2个端的容量的最小值 然后EK就行 #include <cst ...
- uva 10330 - Power Transmission(网络流)
uva 10330 - Power Transmission 题目大意:最大流问题. 解题思路:増广路算法. #include <stdio.h> #include <string. ...
- UVA 10330 Power Transmission
题意:懒得打了.LUCKY CAT 里有 http://163.32.78.26/homework/q10330.htm 第一个网络流题目.每个节点都有一个容量值.需要拆点.拆成i - > i ...
- light oj 1155 - Power Transmission【拆点网络流】
1155 - Power Transmission PDF (English) Statistics Forum Time Limit: 2 second(s) Memory Limit: 32 ...
- lightoj--1155-- Power Transmission (最大流拆点)
Power Transmission Time Limit: 2000MS Memory Limit: 32768KB 64bit IO Format: %lld & %llu Sub ...
- poj 3498 March of the Penguins(最大流+拆点)
题目大意:在南极生活着一些企鹅,这些企鹅站在一些冰块上,现在要让这些企鹅都跳到同一个冰块上.但是企鹅有最大的跳跃距离,每只企鹅从冰块上跳走时会给冰块造成损害,因此企鹅跳离每个冰块都有次数限制.找出企鹅 ...
- UVA 11149 - Power of Matrix(矩阵乘法)
UVA 11149 - Power of Matrix 题目链接 题意:给定一个n*n的矩阵A和k,求∑kiAi 思路:利用倍增去搞.∑kiAi=(1+Ak/2)∑k/2iAi,不断二分就可以 代码: ...
- poj 2391 Ombrophobic Bovines, 最大流, 拆点, 二分, dinic, isap
poj 2391 Ombrophobic Bovines, 最大流, 拆点, 二分 dinic /* * Author: yew1eb * Created Time: 2014年10月31日 星期五 ...
- C2. Power Transmission (Hard Edition)(线段相交)
This problem is same as the previous one, but has larger constraints. It was a Sunday morning when t ...
随机推荐
- MYSQL 删除二进制日志的 3 个方法
方法 1: reset master; ------------------ 删除前: 删除日志: 删除后: ---------------------------------------- 可 ...
- HttpContext.Cache和Application的区别
原文:HttpContext.Cache和Application的区别 (转载) 应用程序级的Cache和Application用户会话级的Session application的缺点是在读取时最 ...
- EventBus源码解析
用例 本文主要按照如下例子展开: //1. 新建bus对象,默认仅能在主线程上对消息进行调度 Bus bus = new Bus(); // maybe singleton //2. 新建类A(sub ...
- docker 创建新的镜像到私有仓库
docker:/data# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES bd6db4127a9e centos &q ...
- C语言的本质(4)——浮点数的本质与运算
C语言的本质(4)--浮点数的本质与运算 C语言规定了3种浮点数,float型.double型和long double型,其中float型占4个字节,double型占8个字节,longdouble型长 ...
- Qt学习--部件深入--烤猪蹄
1,进程条--向用户显示程序的当前状态,向用户提示该任务需要多长时间才能够完成. Qt-ProgressBar创建进程条,QProgressBar,为了使进程条担当起进程指示功能,需要执行定义进程条的 ...
- 【思路解析】discuz 帖子设置封面 setthreadcover 表pre_forum_threadimage
在Discuz 中有一项就是给帖子设置封面,很多情况下只能通过手动的方式去设置或者用提交POST请求的式去设置: 但是这都是调用DISCUZ的功能设置的: 有的时候并非万能的,也有用不到的时候:下面就 ...
- CocoaPods的安装及安装出现问题的处理
ocoaPods安装分两步:第一步.修改本机的Ruby环境:第二步.安装. 第一步:步骤1.打开终端输入 gem sources -l 查看本机的Ruby环境:若显示“https://ruby ...
- Hibernate的介绍
1.什么是Hibernate? 首先,Hibernate是数据持久层的一个轻量级框架.数据持久层的框架有非常多比方:iBATIS,myBatis,Nhibernate,Siena等等. 而且Hiber ...
- Linux系统下安装phpmyadmin方法
phpmyadmin下载地址:不要分,赶紧去下载吧!http://download.csdn.net/detail/u011986449/7429799 1.找到 /libraries/config. ...