刚学了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——第一道网络流的更多相关文章

  1. poj3469 Dual Core CPU

    Dual Core CPU Time Limit: 15000MS   Memory Limit: 131072K Total Submissions: 25576   Accepted: 11033 ...

  2. poj3469 Dual Core CPU——最小割

    题目:http://poj.org/problem?id=3469 最小割水题(竟然没能1A): 代码如下: #include<iostream> #include<cstdio&g ...

  3. POJ3469 Dual Core CPU(最小割)

    形象生动的最小割.. #include<cstdio> #include<cstring> #include<queue> #include<algorith ...

  4. POJ3469 Dual Core CPU(最小割)

    题意:给你n个模块,每个模块在A核花费为ai,在B核跑花费为bi,然后由m个任务(ai,bi,wi),表示如果ai,bi不在同一个核上跑,额外的花费为wi,求最小的花费. 一开始想的时候以为是费用流, ...

  5. POJ 3469.Dual Core CPU 最大流dinic算法模板

    Dual Core CPU Time Limit: 15000MS   Memory Limit: 131072K Total Submissions: 24830   Accepted: 10756 ...

  6. Dual Core CPU

    Dual Core CPU Time Limit: 15000MS Memory Limit: 131072K Total Submissions: 20935 Accepted: 9054 Case ...

  7. poj 3469 Dual Core CPU【求最小割容量】

    Dual Core CPU Time Limit: 15000MS   Memory Limit: 131072K Total Submissions: 21453   Accepted: 9297 ...

  8. POJ 3469 Dual Core CPU Dual Core CPU

    Time Limit: 15000MS   Memory Limit: 131072K Total Submissions: 23780   Accepted: 10338 Case Time Lim ...

  9. HDU-1532 Drainage Ditches,人生第一道网络流!

    Drainage Ditches 自己拉的专题里面没有这题,网上找博客学习网络流的时候看到闯亮学长的博客然后看到这个网络流入门题!随手一敲WA了几发看讨论区才发现坑点! 本题采用的是Edmonds-K ...

随机推荐

  1. Unity 异步加载进度条

    public class View_LoadingScene : MonoBehaviour { //场景加载进度条对象 public GameObject loadingProgressBar; / ...

  2. html5-基本知识小结及补充

    <!DOCTYPE html><html lang="en"><head>    <meta charset="UTF-8&qu ...

  3. Sitecore CMS中配置模板部分

    如何在Sitecore CMS中配置模板部分. 注意: 本教程将扩展于“Sitecore CMS中创建模板”的章节. 配置折叠状态 配置模板部分的折叠状态允许用户选择默认折叠或展开哪些模板部分.此设置 ...

  4. Vim 文本编辑器的基本使用

    Vim文本编辑器是Linux/Unix系统下最常用的工具之一,通过该工具可以很方便的建立.修改.编辑文档或者程序文件,其作用类似与windows系统下的记事本或者notepad++,因此熟练掌握该工具 ...

  5. 初探AngularJs框架(二)

    一.创建Components组件 直接使用AngularCLI即可很方便的创建component组件,使用如下指令: ng g component components/news 这样就会在compo ...

  6. Lucene 个人领悟 (一)

    在上学的时候就对搜索有着极大地兴趣,图书馆也借了好多的书看过,也用过Python写过爬虫. 有好多人在初步学习Lucene的时候都以为他是一个搜索引擎,或者搜索工具. 在此我要特别强调一下,Lucen ...

  7. The Little Prince-11/26

    WRITE BEFORE THE BOOK REVIEW I have read The Little Prince for three or four times. However I still ...

  8. eclipse 出现内存溢出问题解决办法

    1.eclipse.ini添加设置: -vm#eclipse启动使用的jdk设置,路径根据自己实际路径修改 C:/Program Files/Java/jdk1.6.0_45/bin/javaw.ex ...

  9. Selenium在Firefox中踩过的

    本文转至 http://www.51testing.com/html/11/n-3711311.html,作者对webdriver在Firefox中设置profile配置项挺熟的,是用Python实现 ...

  10. PyQt5-多窗口数据传输

    #窗口之间数据传递(通过属性方式) from PyQt5.QtWidgets import QDialogButtonBox, QDateTimeEdit,QDialog,QComboBox,QTab ...