博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
poj 3469 Dual Core CPU 最小割
阅读量:4440 次
发布时间:2019-06-07

本文共 1372 字,大约阅读时间需要 4 分钟。

构图思路:

1. 源点S与顶点v连边,容量为A

2. 顶点v与汇点T连边,容量为B

3. 边(a,b,c),则顶点a与顶点b连双向边,容量为c

则最小花费为该图最小割即最大流。

 

若两个作业分别在不同机器运行,则之间若有边,则必定是满流,否则必定还有增广路。

#include
#include
#include
#include
using namespace std;const int inf = 0x3f3f3f3f;const int MAXN = (int)2e5+10;int n, m;int S, T, N;int head[MAXN], idx;struct Edge{ int v, f, nxt;}edge[MAXN<<3];void AddEdge(int u,int v,int f){ edge[idx].v = v, edge[idx].f = f; edge[idx].nxt = head[u], head[u] = idx++; edge[idx].v = u, edge[idx].f = 0; edge[idx].nxt = head[v], head[v] = idx++;}int vh[MAXN], h[MAXN];int dfs(int u,int flow){ if(u == T) return flow; int tmp = h[u]+1, sum = flow; for(int i = head[u]; ~i; i = edge[i].nxt ){ if( edge[i].f && (h[edge[i].v]+1 == h[u]) ){ int p = dfs( edge[i].v, min(sum,edge[i].f)); edge[i].f -= p, edge[i^1].f += p, sum -= p; if( sum == 0 || h[S] == N ) return flow - sum; } } for(int i = head[u]; ~i; i = edge[i].nxt ) if( edge[i].f ) tmp = min( tmp, h[ edge[i].v ] ); if( --vh[ h[u] ] == 0 ) h[S] = N; else ++vh[ h[u]=tmp+1 ]; return flow-sum;}int sap(){ int maxflow = 0; memset(h,0,sizeof(h)); memset(vh,0,sizeof(vh)); vh[0] = N; while( h[S]
View Code

 

转载于:https://www.cnblogs.com/yefeng1627/p/3176263.html

你可能感兴趣的文章
jQuery 特效:盒子破碎和移动动画效果
查看>>
Pexels Videos – 可以免费商业使用的短视频
查看>>
推荐15款最佳的响应式 Web 设计测试工具
查看>>
Handler
查看>>
USACO 4.3 Letter Game
查看>>
理解MapReduce计算构架
查看>>
带外数据的接收与发送
查看>>
js 闭包
查看>>
SQL Server 事务、异常和游标(转)
查看>>
循环赛日程编排c代码
查看>>
Python复习笔记-字典和文件操作
查看>>
eclipse 编码设置<非原创>
查看>>
CentOs Linux 常见命令
查看>>
maven搭建springmvc+mybatis项目
查看>>
sql 经典语句【摘录】
查看>>
zigzag数组,螺旋数组
查看>>
iOS SQLite3的使用
查看>>
[Leetcode]017. Letter Combinations of a Phone Number
查看>>
Luogu 3375 【模板】KMP字符串匹配(KMP算法)
查看>>
[poj1737]Connected Graph(连通图计数)
查看>>