【做题】POJ3469 Dual Core CPU——第一道网络流
刚学了Dinic就开始做题,然后就崩了。
题意:若干个任务,可以放在两个CPU中任意一个上完成,各有一定代价。其中又有若干对任务,如果它们不在同一个CPU上完成,会产生额外代价。最小化并输出代价。
一开始的想法是吧一个任务拆开成两个点(受2-sat的影响),然后就发现自己没法做了。首先,需要保证由同一个任务拆成的两个点只流过一个,这就会使最大流变成费用流。(我不会费用流)其次,难以满足第二个要求。后来一想,网络流与2-sat建图的区别在于网络流的状态表现在边的流量上(是否满流),而2-sat表现于同组点的取舍上。同样地,我也不能在2-sat和单位网络之间划等号。前者的作用是生成一个可行的方案,后者则是最优解。
那么,如上文所述,我们见图时要把状态表现在流量上。先不考虑额外代价,对于一个任务,它应该接着两条边表示两种选择。于是,可以从题解上抄到想到从超级源点向它建一条容量为第一种选择代价的边,从它向超级汇点建一条容量为第二种选择的边。此时这张图的最小割就是最优解。
然后考虑额外代价。存在这个代价当且仅当两个任务处割掉了位置不同的边。
左上图:两个任务处割掉了位置不同的边
然后,我们只要在两个任务之间建一条容量为额外代价的双向边就可以了。这时因为割的性质就能把额外代价考虑其中了。并且,这不会影响其他情况。
故我们完成了建图,然后就只需要贴板子卡常就可以了。
令人震惊的是:时间复杂度O(n^2*m)。代码已自动过滤快读、register、inline
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <queue>
using namespace std;
const int N = , M = , INF = <<;
int n,m,s,t;
struct edge {
int la,b,cap,flo;
edge(int la=,int b=,int cap=,int flo=):
la(la),b(b),cap(cap),flo(flo){};
}con[M<<];
int tot,fir[N],cur[N],d[N];
void add(int from,int to,int cap,int cap_back=) {
con[++tot] = edge(fir[from],to,cap);
fir[from] = tot;
con[++tot] = edge(fir[to],from,cap_back);
fir[to] = tot;
}
bool vis[N];
void init() {
for (int i=;i<=n;++i) cur[i] = fir[i];
memset(vis,,sizeof vis);
}
bool bfs() {
init();
queue<int> q;
while (!q.empty()) q.pop();
q.push(s);
d[s] = ;
vis[s] = ;
for (int pos = q.front();!q.empty();q.pop(),pos = q.front()) {
for (int i=fir[pos];i;i=con[i].la) if (!vis[con[i].b]) {
if (con[i].cap>con[i].flo) {
d[con[i].b] = d[pos] + ;
vis[con[i].b] = ;
q.push(con[i].b);
}
}
}
return vis[t];
}
int dfs(int x,int imp) {
if (x == t||!imp) return imp;
int expo = , tmp;
for (int &i=cur[x];i;i=con[i].la) if (d[con[i].b] == d[x] + ) {
tmp = dfs(con[i].b,min(imp,con[i].cap-con[i].flo));
if (tmp > ) {
con[i].flo += tmp;
con[i^].flo -= tmp;
expo += tmp;
imp -= tmp;
if (!imp) break;
}
}
return expo;
}
int solve() {
int res = ;
while (bfs()) {
res += dfs(s,INF);
}
return res;
}
int main() {
int a,b,w;
while (scanf("%d%d",&n,&m)!=EOF) {
memset (fir,,sizeof fir);
tot = ;
for (int i=;i<=n;++i) {
scanf("%d%d",&a,&b);
add(n+,i,a);
add(i,n+,b);
}
for (int i=;i<=m;++i) {
scanf("%d%d",&a,&b,&w);
add(a,b,w,w);
}
s = n+, t = n+;
n += ;
printf("%d\n",solve());
}
return ;
}
小结:这可以说是对网络流模型的理解还不够。
【做题】POJ3469 Dual Core CPU——第一道网络流的更多相关文章
- poj3469 Dual Core CPU
Dual Core CPU Time Limit: 15000MS Memory Limit: 131072K Total Submissions: 25576 Accepted: 11033 ...
- poj3469 Dual Core CPU——最小割
题目:http://poj.org/problem?id=3469 最小割水题(竟然没能1A): 代码如下: #include<iostream> #include<cstdio&g ...
- POJ3469 Dual Core CPU(最小割)
形象生动的最小割.. #include<cstdio> #include<cstring> #include<queue> #include<algorith ...
- POJ3469 Dual Core CPU(最小割)
题意:给你n个模块,每个模块在A核花费为ai,在B核跑花费为bi,然后由m个任务(ai,bi,wi),表示如果ai,bi不在同一个核上跑,额外的花费为wi,求最小的花费. 一开始想的时候以为是费用流, ...
- POJ 3469.Dual Core CPU 最大流dinic算法模板
Dual Core CPU Time Limit: 15000MS Memory Limit: 131072K Total Submissions: 24830 Accepted: 10756 ...
- Dual Core CPU
Dual Core CPU Time Limit: 15000MS Memory Limit: 131072K Total Submissions: 20935 Accepted: 9054 Case ...
- poj 3469 Dual Core CPU【求最小割容量】
Dual Core CPU Time Limit: 15000MS Memory Limit: 131072K Total Submissions: 21453 Accepted: 9297 ...
- POJ 3469 Dual Core CPU Dual Core CPU
Time Limit: 15000MS Memory Limit: 131072K Total Submissions: 23780 Accepted: 10338 Case Time Lim ...
- HDU-1532 Drainage Ditches,人生第一道网络流!
Drainage Ditches 自己拉的专题里面没有这题,网上找博客学习网络流的时候看到闯亮学长的博客然后看到这个网络流入门题!随手一敲WA了几发看讨论区才发现坑点! 本题采用的是Edmonds-K ...
随机推荐
- idea上传项目到github出现"remote with selected name already exists"情况的解决
1. 2. 3.
- java中的锁之Lock接口与Condition接口
一.Lock源码. 1.是一个接口.一共有6个方法. 2.方法详细如下: (1)当前线程尝试获取锁.结果分两种情况,一是成功获取到锁,则返回:二是获取锁失败,则一直等待.不响应中断请求. (2)当前线 ...
- repr()函数
http://www.cnblogs.com/itdyb/p/5046415.html
- Code Review(转)
Code Review是一种通过复查代码提高代码质量的过程,在XP方法中占有极为重要的地位,也已经成为软件工程中一个不可缺少的环节.本文通过对Code Review的一些概念和经验的探讨,就如何进行C ...
- Mvcpager以下各节已定义,但尚未为布局页“~/Views/Shared/_Layout.cshtml”呈现:“Scripts”。
解决办法如下: 1.在_Layout.cshtml布局body内,添加section,Scripts.Render和RenderSection标签示例代码如下: <body class=&quo ...
- 20155228 2017-5-10 课堂测试:MySort
20155228 2017-5-10 课堂测试:MySort 题目和要求 模拟实现Linux下Sort-t:-k2的功能.参考Sort的实现.提交码云链接和代码运行截图. import java.ut ...
- STL容器之deque
[1]deque容器 deque 是对 vector 和 list 优缺点的结合,它是处于两者之间的一种容器. [2]deque方法集 应用示例代码: #include <deque> # ...
- python 内置函数format
Python2.6 开始,新增了一种格式化字符串的函数 str.format(),它增强了字符串格式化的功能. 基本语法是通过 {} 和 : 来代替以前的 % . format 函数可以接受不限个参数 ...
- Bodymovin:Bodymovin和Lottie:把AE动画转换成HTML5/Android/iOS原生动画
转自:https://www.cnblogs.com/zamhown/p/6688369.html 大杀器Bodymovin和Lottie:把AE动画转换成HTML5/Android/iOS原生动画 ...
- linux监控性能和网络的命令
vmstat查看机器实时的综合情况:load,内存,swap,cpu使用率等方面 procs: r:运行队列中进程数量 b:等待IO的进程数量 memory(内存): swpd:使用虚拟内存大小 fr ...