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(最大流--拆点)的更多相关文章

  1. UVa 10330 Power Transmission / 最大流

    最大流 这题有很多起点和终点 在取2个点(0和n+1) 作为唯一的起点和终点 此外每个点也有容量限制 建图时每条边上的容量为这条边和2个端的容量的最小值 然后EK就行 #include <cst ...

  2. uva 10330 - Power Transmission(网络流)

    uva 10330 - Power Transmission 题目大意:最大流问题. 解题思路:増广路算法. #include <stdio.h> #include <string. ...

  3. UVA 10330 Power Transmission

    题意:懒得打了.LUCKY CAT 里有 http://163.32.78.26/homework/q10330.htm 第一个网络流题目.每个节点都有一个容量值.需要拆点.拆成i - > i ...

  4. light oj 1155 - Power Transmission【拆点网络流】

    1155 - Power Transmission   PDF (English) Statistics Forum Time Limit: 2 second(s) Memory Limit: 32 ...

  5. lightoj--1155-- Power Transmission (最大流拆点)

    Power Transmission Time Limit: 2000MS   Memory Limit: 32768KB   64bit IO Format: %lld & %llu Sub ...

  6. poj 3498 March of the Penguins(最大流+拆点)

    题目大意:在南极生活着一些企鹅,这些企鹅站在一些冰块上,现在要让这些企鹅都跳到同一个冰块上.但是企鹅有最大的跳跃距离,每只企鹅从冰块上跳走时会给冰块造成损害,因此企鹅跳离每个冰块都有次数限制.找出企鹅 ...

  7. UVA 11149 - Power of Matrix(矩阵乘法)

    UVA 11149 - Power of Matrix 题目链接 题意:给定一个n*n的矩阵A和k,求∑kiAi 思路:利用倍增去搞.∑kiAi=(1+Ak/2)∑k/2iAi,不断二分就可以 代码: ...

  8. poj 2391 Ombrophobic Bovines, 最大流, 拆点, 二分, dinic, isap

    poj 2391 Ombrophobic Bovines, 最大流, 拆点, 二分 dinic /* * Author: yew1eb * Created Time: 2014年10月31日 星期五 ...

  9. C2. Power Transmission (Hard Edition)(线段相交)

    This problem is same as the previous one, but has larger constraints. It was a Sunday morning when t ...

随机推荐

  1. 4x4矩阵键盘扫描

    4x4矩阵键盘扫描 Windows 10 IoT Core 是微软针对物联网市场的一个重要产品,与以往的Windows版本不同,是为物联网设备专门设计的,硬件也不仅仅限于x86架构,同时可以在ARM架 ...

  2. Android02-Activity01

    1.概念:活动是一种可以包含用户界面的组件, 主要用于和用户进行交互. 2.常见操作:      1.隐藏Activity的标题栏: @Override protected void onCreate ...

  3. Android Http异步请求,Callback

    1 首先是HttpConnection,方法包括HttPost, HttpGet package com.juupoo.common; import java.util.ArrayList; impo ...

  4. 理解Unity加载和内存管理

    转自:http://game.ceeger.com/forum/read.php?tid=4394#info Unity里有两种动态加载机制:一是Resources.Load,一是通过AssetBun ...

  5. 基于本地iso 搭建的本地yum源 安装部署openldap

    1,yum openldap-servers,openldap-clients 基于iso-cd1搭建的本地yum源(具体搭建参看ruige的repo本地快速搭建,在右边 找找看中输入repo key ...

  6. C#:获取时间年月日时分秒格式

    //获取日期+时间 DateTime.Now.ToString();            // 2008-9-4 20:02:10 DateTime.Now.ToLocalTime().ToStri ...

  7. JAVA 可视化分析工具 第12节

    JAVA 可视化分析工具  第12节 经过前几章对堆内存以及垃圾收集机制的学习,相信小伙伴们已经建立了一套比较完整的理论体系!那么这章我们就根据已有的理论知识,通过可视化工具来实践一番. 我们今天要讲 ...

  8. PHP性能如何实现全面优化?

    性能是网站运行是否良好的关键因素, 网站的性能与效率影响着公司的运营成本及长远发展,编写出高质高效的代码是我们每个开发人员必备的素质,也是我们良好的职业素养. 如何优化PHP性能呢? 一.变量(重要) ...

  9. cdh 上安装spark on yarn

    在cdh 上安装spark on yarn 还是比较简单的,不需要独立安装什么模块或者组件. 安装服务 选择on yarn 模式:上面 Spark 在spark 服务中添加 在yarn 服务中添加 g ...

  10. C语言的声明和定义

    在程序设计中,时时刻刻都用到变量的定义和变量的声明,可有些时候我们对这个概念不是很清楚,知道它是怎么用,但却不知是怎么一会事. 下面我就简单的把他们的区别介绍如下: 变量的声明有两种情况: (1)一种 ...