【做题】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 ...
随机推荐
- Beta阶段冲刺前计划与安排
凡事预则立,在Beta开始前,以小组为单位,在敏捷冲刺前发布一篇博客,描述: 1. 介绍小组新加入的成员,Ta担任的角色. 新加入的成员是丁蓉同学,在本团队中担任前端设计. 原因:在之前的团队中,她就 ...
- pyinstaller将python脚本生成exe
一.下载pyinstaller 二.生成exe 下载pyinstaller 1.在C:\python27\Scripts目录下打开cmd界面,执行命令:pip install PyInstaller ...
- Chess (SG + 状态压缩预处理)
#include<bits/stdc++.h> #define bit(t) (1 << t) using namespace std; <<; ;//k是集合s的 ...
- Nginx技术研究系列1-通过应用场景看Nginx的反向代理
随着我们业务规模的不断增长,整个系统规模由两年前的几十台服务器,井喷到现在2个数据中心,接近400台服务器,上百个WebApi站点,上百个域名. 这么多的WebApi站点这么多的域名,管理和维护成本很 ...
- Block 循环引用(中)
不会造成循环引用的block 大部分GCD方法 dispatch_async(dispatch_get_main_queue(), ^{ [self doSomething]; }); 因为self并 ...
- Linux 系统管理命令
1,uanme 查看是什么系统 uname - r 查看系统内核版本 2 cat /proc/cpuinfo 查看cpu 信息 3 cat /proc/meminfo 查看内存信息 4 date 查看 ...
- DBUtils (30)
DBUtils是java编程中的数据库操作实用工具,小巧简单实用. DBUtils封装了对JDBC的操作,简化了JDBC操作,可以少写代码. Dbutils三个核心功能介绍 一. QueryRunn ...
- mybatis源码解析10---StatementHandler解析
StatementHandler解析 接口的作用是statement处理器,位于mybatis包的org.apache.ibatis.executor.statement目录下,源码如下: packa ...
- Spring整合Shiro
apache shiro 是一个安全认证框架,和 spring security 相比,在于他使用了比较简洁易懂的 认证和授权方式.其提供的 native-session(即把用户认证后的授权信息保存 ...
- maven 项目打可执行jar包
昨晚,突然就来了紧急任务. 验签较慢,着手优化,发来一个demo. 首先需要把该demo部署在Linux上. 该项目是maven 项目,所以用maven打个jar包,打完jar包之后, ...