题意就是有n个模块,每个模块可以运行在两个核心上,A核心和B核心,相应的有一个花费,有一些模块如果不在一个核心上运行就会产生额外的花费
现在要求最小的花费是的所有模块都运行
建图如下:
每个模块点,源点与其连边,容量为A花费,在用其与汇点连边,容量为相应B花费
然后如果有某对模块之间不运行在一个核心上会产生额外的花费,就对这两点建双向边,容量都为那个额外的花费
然后就是最小割模型
为啥这样建图就行呢, 可以观察, 如果一对点,假设为u,v之间不运行在一个模块会产生花费
首先,每个点不是与源点的边就是与汇点的边在割中,假如我们的割是有(s, u) (v, t) ,那么显然(v,u)这条边必须割掉,否则 s->v->u->t构成一条路径
如果割是(s,u) (s,v) 那么u,v之间的双向边一条也不需要割掉。也就满足了题意
#include <iostream>
#include <algorithm>
#include <cstring>
#include <string>
#include <cstdio>
#include <cmath>
#include <queue>
#include <map>
#include <set>
#define eps 1e-5
#define MAXN 22222
#define MAXM 1111111
#define INF 100000007
using namespace std;
struct node
{
int v; // vtex
int c; // cacity
int f; // current f in this arc
int next, r;
}edge[MAXM];
int dist[MAXN], nm[MAXN], src, des, n;
int head[MAXN], e;
void add(int x, int y, int c)
{
edge[e].v = y;
edge[e].c = c;
edge[e].f = 0;
edge[e].r = e + 1;
edge[e].next = head[x];
head[x] = e++;
edge[e].v = x;
edge[e].c = 0;
edge[e].f = 0;
edge[e].r = e - 1;
edge[e].next = head[y];
head[y] = e++;
}
void rev_BFS()
{
int Q[MAXN], h = 0, t = 0;
for(int i = 1; i <= n; ++i)
{
dist[i] = MAXN;
nm[i] = 0;
}
Q[t++] = des;
dist[des] = 0;
nm[0] = 1;
while(h != t)
{
int v = Q[h++];
for(int i = head[v]; i != -1; i = edge[i].next)
{
if(edge[edge[i].r].c == 0 || dist[edge[i].v] < MAXN)continue;
dist[edge[i].v] = dist[v] + 1;
++nm[dist[edge[i].v]];
Q[t++] = edge[i].v;
}
}
}
void init()
{
e = 0;
memset(head, -1, sizeof(head));
}
int maxflow()
{
rev_BFS();
int u;
int total = 0;
int cur[MAXN], rpath[MAXN];
for(int i = 1; i <= n; ++i)cur[i] = head[i];
u = src;
while(dist[src] < n)
{
if(u == des) // find an augmenting path
{
int tf = INF;
for(int i = src; i != des; i = edge[cur[i]].v)
tf = min(tf, edge[cur[i]].c);
for(int i = src; i != des; i = edge[cur[i]].v)
{
edge[cur[i]].c -= tf;
edge[edge[cur[i]].r].c += tf;
edge[cur[i]].f += tf;
edge[edge[cur[i]].r].f -= tf;
}
total += tf;
u = src;
}
int i;
for(i = cur[u]; i != -1; i = edge[i].next)
if(edge[i].c > 0 && dist[u] == dist[edge[i].v] + 1)break;
if(i != -1) // find an admissible arc, then Advance
{
cur[u] = i;
rpath[edge[i].v] = edge[i].r;
u = edge[i].v;
}
else // no admissible arc, then relabel this vtex
{
if(0 == (--nm[dist[u]]))break; // GAP cut, Important!
cur[u] = head[u];
int mindist = n;
for(int j = head[u]; j != -1; j = edge[j].next)
if(edge[j].c > 0)mindist = min(mindist, dist[edge[j].v]);
dist[u] = mindist + 1;
++nm[dist[u]];
if(u != src)
u = edge[rpath[u]].v; // Backtrack
}
}
return total;
}
int nt, m;
int main()
{
int u, v, w, A, B;
scanf("%d%d", &nt, &m);
src = nt + 1;
des = nt + 2;
n = des;
init();
for(int i = 1; i <= nt; i++)
{
scanf("%d%d", &A, &B);
add(src, i, A);
add(i, des, B);
}
for(int i = 1; i <= m; i++)
{
scanf("%d%d%d", &u, &v, &w);
add(u, v, w);
add(v, u, w);
}
printf("%d\n", maxflow());
return 0;
}
分享到:
相关推荐
常见的解法包括Ford-Fulkerson方法和Edmonds-Karp算法,这些都是基于增广路径的网络流算法,用于求解最大流,进而得到最小割。 在实际应用中,最小割推荐算法可能会与其他技术结合,如协同过滤、基于内容的推荐或者...
4. POJ3469虽然看起来不是标准的最小割问题,但它与资源分配和优化相关。两个处理器的工作时间问题可以被视为在网络中寻找最佳分配路径,使得总时间最短。这个问题可能需要采用贪心策略或动态规划来解决,不过最小割...
【二分图顶点覆盖->最小割->最大流->Dinic算法求解】 解题报告+AC代码 http://hi.csdn.net/!s/WKVPR0 ----> 我的所有POJ解题报告 http://blog.csdn.net/lyy289065406/article/details/6642573
* 最小割模型、网络流规约:例如 poj3308。 3. 数据结构: * 线段树:例如 poj2528、poj2828、poj2777、poj2886、poj2750。 * 静态二叉检索树:例如 poj2482、poj2352。 * 树状树组:例如 poj1195、poj3321。 ...
在初级阶段的基础上,中级阶段涵盖了更多复杂的数据结构和算法,如差分约束系统、最小费用最大流、双连通分量、强连通分支、最小割模型等,以及线段树、树状数组、RMQ查询等高级数据结构的应用。这些内容进一步深化...
- **知识点**:最大流算法,用于解决图中源点到汇点的最大流量问题,例如Ford-Fulkerson算法。 #### 1274 The Perfect Stall - 二分匹配 - **知识点**:二分匹配算法,用于解决二分图中的最大匹配问题。 #### ...
### 网络流建模汇总 ...以上内容涵盖了网络流建模中的几个核心概念,包括最大流、最小割、有上下界流以及最小费用最大流。通过对这些概念的理解和应用,我们可以解决许多实际问题中的资源分配、优化等问题。
3. **图算法的深化**:如差分约束系统、最小费用最大流、双连通分量、强连通分支及其缩点、图的割边和割点、最小割模型等。poj1201、poj2983等涉及这些高级图算法。 4. **高级数据结构**:如线段树、平衡树(Treap、...
3. **图论与网络流**:如果雷达之间存在干扰,可能需要将它们看作图中的节点,通过构建网络来求解最小割或最大流问题,以找到最佳安装方案。 4. **动态规划**:如果问题具有重叠子问题和最优子结构的特性,可能会...
#### 最大流最小割 - **题目示例**: - POJ 3352:最大流问题的求解。 ### 数据结构 #### 栈 - **题目示例**: - POJ 2528、POJ 2828:栈的基本操作与应用场景。 #### 队列 - **题目示例**: - POJ 2777、POJ ...
* 最小割模型、网络流规约 + poj3308 三、数据结构 * 线段树 + poj2528, poj2828, poj2777, poj2886, poj2750 * 静态二叉检索树 + poj2482, poj2352 * 树状树组 + poj1195, poj3321 * RMQ + poj3264, poj3368...
3. **网络流**:Max-flow算法,用于解决最大流问题(poj1094)。 4. **拓扑排序**:解决有向无环图的排序问题(poj3041, poj3020)。 5. **匹配算法**:如KM算法,用于解决二分图的最大匹配问题(poj1459, poj3436)...
8. **最小割模**:寻找图中的最小割,通常用于优化问题。 以上就是POJ平台中涉及到的一些基础和进阶算法及其相关的编程题目,这些知识对于提升编程能力和解决实际问题具有重要意义。通过不断练习和学习,可以逐步...
- **定义**:在图中找到费用最小的最大流。 - **示例题目**: - poj2516 - poj2195 - **应用场景**:适用于网络流量优化、资源分配等问题。 **5. 双连通分量** - **定义**:在图中找到所有的双连通分量。 - **...
6. **图论与网络流**:包括深度优先搜索(DFS)、广度优先搜索(BFS)、最大流问题和最小割问题等。 7. **字符串处理**:涉及到模式匹配、KMP算法、后缀数组或AC自动机等字符串相关的算法。 8. **数学技巧**:可能...
6. **网络流**:最大流、最小割等网络优化问题。 7. **图论**:最短路径问题(Dijkstra、Floyd-Warshall等)、拓扑排序、关键路径等。 每个解答都可能包含对问题的分析、解题思路、算法设计以及完整的源代码。学习...
最小割的值等于网络的最大流,这是网络流的基本定理之一。在求解最大流问题时,可以采用Dinic算法或Shortest Augmenting Path (SAP)算法。 3. **最大权闭合子图**: 最大权闭合子图问题是寻找一个有向图的子图,...
首先,最小费用最大流算法是一种结合了最大流问题和最小割问题的优化版本,适用于解决带权的匹配问题。在上述的POJ2195题目中,问题被转化为找到每个人到房子的最低成本路径,使得每个人都能进入一间房子。这个问题...
(4) 最小费用最大流:poj2516, poj2516, poj2195 (5) 双连通分量:poj2942 (6) 图的割边和割点:poj3352 七、数学 本部分涵盖了数学,包括组合数学、数论和计算方法。 (1) 组合数学:poj3252, poj1850, poj1019, ...