POJ 3469 网络流最小割
将两个CPU分别视作源点和汇点
对于那些不在同一个CPU中的模块会产生的代价作为一条双向的容量弧
这里每个模块可以在任意一个CPU中运行,相当于寻找一个割,分割后,在S集合中的模块安装在第一个CPU中
那么在T集合中的模块就是在第二个CPU中,所求的最小割也正是最小耗费
根据最大流=最小割的原理,这里相当于是在求最大流
#include <cstdio>
#include <cstring>
#include <iostream>
#include <queue> using namespace std;
const int N = ;
const int INF = 0x3f3f3f3f;
int lev[N],first[N],k; struct Edge{
int u , v , cap , flow , next;
}e[N*]; void add_edge(int u , int v , int cap)
{
e[k].u=u , e[k].v = v , e[k].cap=cap , e[k].flow= , e[k].next = first[u];
first[u]=k++;
}
//寻找层次网络是否存在
bool find_level(int n)
{
queue<int> q;
q.push();
memset(lev , , sizeof(lev));
lev[]=;
while(!q.empty())
{
int u=q.front();
q.pop();
for(int i=first[u] ; i!=- ; i=e[i].next){
int v = e[i].v;
if(!lev[v] && e[i].cap > e[i].flow){
lev[v] = lev[u]+;
q.push(v);
}
}
}
return lev[n+]>;
} int Dinic(int n , int u , int sum)
{
int s = sum , t;
if(u == n+) return sum;
for(int i=first[u] ; i!=- ;i=e[i].next)
{
int v = e[i].v;
if(lev[v] != lev[u]+ || e[i].cap <= e[i].flow) continue;
t = Dinic(n , v , min(sum , e[i].cap - e[i].flow));
e[i].flow += t;
e[i^].flow -= t;
sum-=t;
}
return s-sum;
} int main()
{
// freopen("a.in" , "r" , stdin);
int n , m , u , v , cap1 , cap2;
while(scanf("%d%d" , &n , &m) == )
{
k=;
memset(first , - , sizeof(first));
for(int i= ; i<n ; i++)
{
scanf("%d%d" , &cap1 , &cap2);
//添加双向弧
add_edge( , i+ , cap1);
add_edge(i+ , , ); add_edge(i+ , n+ , cap2);
add_edge(n+ , i+ , );
}
for(int i= ; i<m ; i++)
{
scanf("%d%d%d" , &u , &v , &cap1);
add_edge(u , v , cap1);
add_edge(v , u , cap1);
}
int max_flow = ;
while(find_level(n)){
max_flow += Dinic(n , , INF);
}
printf("%d\n" , max_flow);
}
return ;
}
POJ 3469 网络流最小割的更多相关文章
- 【题解】 bzoj3894: 文理分科 (网络流/最小割)
bzoj3894,懒得复制题面,戳我戳我 Solution: 首先这是一个网络流,应该还比较好想,主要就是考虑建图了. 我们来分析下题面,因为一个人要么选文科要么选理科,相当于两条流里面割掉一条(怎么 ...
- 【bzoj3774】最优选择 网络流最小割
题目描述 小N手上有一个N*M的方格图,控制某一个点要付出Aij的代价,然后某个点如果被控制了,或者他周围的所有点(上下左右)都被控制了,那么他就算是被选择了的.一个点如果被选择了,那么可以得到Bij ...
- 【bzoj1143】[CTSC2008]祭祀river Floyd+网络流最小割
题目描述 在遥远的东方,有一个神秘的民族,自称Y族.他们世代居住在水面上,奉龙王为神.每逢重大庆典, Y族都会在水面上举办盛大的祭祀活动.我们可以把Y族居住地水系看成一个由岔口和河道组成的网络.每条河 ...
- 【bzoj1797】[Ahoi2009]Mincut 最小割 网络流最小割+Tarjan
题目描述 给定一张图,对于每一条边询问:(1)是否存在割断该边的s-t最小割 (2)是否所有s-t最小割都割断该边 输入 第一行有4个正整数,依次为N,M,s和t.第2行到第(M+1)行每行3个正 整 ...
- 【bzoj1976】[BeiJing2010组队]能量魔方 Cube 网络流最小割
题目描述 一个n*n*n的立方体,每个位置为0或1.有些位置已经确定,还有一些需要待填入.问最后可以得到的 相邻且填入的数不同的点对 的数目最大. 输入 第一行包含一个数N,表示魔方的大小. 接下来 ...
- 【bzoj4177】Mike的农场 网络流最小割
题目描述 Mike有一个农场,这个农场n个牲畜围栏,现在他想在每个牲畜围栏中养一只动物,每只动物可以是牛或羊,并且每个牲畜围栏中的饲养条件都不同,其中第i个牲畜围栏中的动物长大后,每只牛可以卖a[i] ...
- 【bzoj3438】小M的作物 网络流最小割
原文地址:http://www.cnblogs.com/GXZlegend/p/6801522.html 题目描述 小M在MC里开辟了两块巨大的耕地A和B(你可以认为容量是无穷),现在,小P有n中作物 ...
- 【bzoj3144】[Hnoi2013]切糕 网络流最小割
题目描述 输入 第一行是三个正整数P,Q,R,表示切糕的长P. 宽Q.高R.第二行有一个非负整数D,表示光滑性要求.接下来是R个P行Q列的矩阵,第z个 矩阵的第x行第y列是v(x,y,z) (1≤x≤ ...
- 【bzoj3894】文理分科 网络流最小割
原文地址:http://www.cnblogs.com/GXZlegend 题目描述 文理分科是一件很纠结的事情!(虽然看到这个题目的人肯定都没有纠结过) 小P所在的班级要进行文理分科.他的班级可以用 ...
随机推荐
- 牛客小白月赛5-I-区间(差分求前缀和+一次暴力统计)
题目描述 Apojacsleam喜欢数组. 他现在有一个n个元素的数组a,而他要对a[L]-a[R]进行M次操作: 操作一:将a[L]-a[R]内的元素都加上P 操作二:将a[L]-a[R]内的元素都 ...
- 题解报告:hdu 2057 A + B Again
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2057 问题描述 我们的HDOJ必须有许多A + B问题,现在又有新的问题出现. 给你两个十六进制整数, ...
- 循环队列 分类: c/c++ 2014-10-10 23:28 605人阅读 评论(0) 收藏
利用线性表实现队列,为了有效利用空间,将其设计为循环结构,防止假溢出:牺牲一个存储单元以区分队空.队满. 设front队头,rear队尾,N为顺序表大小 队空:rear==front 队满:(rear ...
- Android推送服务(1)几种实现方式
1.几种常见的解决方案实现原理 1)轮询(Pull)方式:应用程序应当阶段性的与服务器进行连接并查询是否有新的消息到达,你必须自己实现与服务器之间的通信,例如消息排队等.而且你还要考虑轮询的频率,如果 ...
- Java中的流(2)字节流-InputStream和OutputStream
字节流的两个顶层类是抽象类:InputStream和OutputStream 1. OutputStream void write(int b) 往流中写一个字节b void write(byte b ...
- javaweb-JSP action中附件下载的写法
附件下载(包括图片,exl,word)在前台必须给出一个iframe 或者类似于window的窗口,另外,Java文件下载不能通过ajax进行请求,必须添加src属性首选,前台的链接拼接html如下 ...
- laravel 淘宝 NPM 镜像
淘宝 NPM 镜像:http://npm.taobao.org/ 这是一个完整 npmjs.org 镜像,你可以用此代替官方版本(只读),同步频率目前为 10分钟 一次以保证尽量与官方服务同步. 当前 ...
- html5移动端适配- media query
iPad部分css适配 - media query 代码如下图: 注: @media要放在css最下方,防止被覆盖.
- STM32 (基础语法)笔记
指针遍历: char *myitoa(int value, char *string, int radix){ int i, d; int flag = 0; char *ptr = string; ...
- Python_高阶函数、装饰器(decorator)
一.变量: Python支持多种数据类型,在计算机内部,可以把任何数据都看成一个“对象”,而变量就是在程序中用来指向这些数据对象的,对变量赋值就是把数据和变量给关联起来. 对变量赋值x = y是把变量 ...