POJ--3469--Dual Core CPU【Dinic】最小割

链接:http://poj.org/problem?id=3469

题意:有一个双核CPU,有n个模块需要在cpu上处理,在两个核上运行的耗费分别是Ai和Bi,m对模块需要共享数据,如果它们运行在同一个cpu中,共享数据的耗费可以忽略不计,否则需要额外的费用。求最小总耗费值。

思路:将两个cpu视为源点、汇点,模块视为图中顶点,对于每个Ai和Bi,可以从源点连一条容量为Ai的弧到i,从i连一条容量为Bi的弧到汇点,对于两个模块之间需要共享数据的情况,在它们之间连两条弧,正向和反向,容量为额外耗费,此时每个顶点都和源点、汇点相连,即每个顶点都可以在任意一个cpu中运行。

这样构图,对于图中任意一个割,源点、汇点都不是连通的,因此每个顶点都不可能同时和源点及汇点相连,也即每个顶点只能在一个cpu中运行。此时耗费即为割的容量,要让割的容量最小,根据最大流最小割定理,只需求原图的最大流即可。

这回我顺手写了昨天的优化,T了。。。用原来的代码,反而AC了,虽然也比较慢将近10s,我决定以后对边比较多的图还是用原来的写法,对边少的用类似多路增广优化的写法。

#include<cstring>
#include<string>
#include<fstream>
#include<iostream>
#include<iomanip>
#include<cstdio>
#include<cctype>
#include<algorithm>
#include<queue>
#include<map>
#include<set>
#include<vector>
#include<stack>
#include<ctime>
#include<cstdlib>
#include<functional>
#include<cmath>
using namespace std;
#define PI acos(-1.0)
#define MAXN 500100
#define eps 1e-7
#define INF 0x7FFFFFFF
#define LLINF 0x7FFFFFFFFFFFFFFF
#define seed 131
#define mod 1000000007
#define ll long long
#define ull unsigned ll
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1

struct node{
    int u,w,next;
}edge[MAXN];
int head[20100],dist[20100];
int cnt,n,m,src,sink;
void add_edge(int a,int b,int c){
    edge[cnt].u = b;
    edge[cnt].w = c;
    edge[cnt].next = head[a];
    head[a] = cnt++;
}
bool bfs(){
    int i,j;
    memset(dist,-1,sizeof(dist));
    dist[src] = 1;
    queue<int>q;
    q.push(src);
    while(!q.empty()){
        int u = q.front();
        q.pop();
        for(i=head[u];i!=-1;i=edge[i].next){
            int v = edge[i].u;
            if(dist[v]==-1&&edge[i].w){
                dist[v] = dist[u] + 1;
                q.push(v);
            }
        }
    }
    if(dist[sink]==-1)  return false;
    else    return true;
}
int dfs(int u,int delta){
    int i,j,dd;
    if(u==sink) return delta;
    int ret = 0;
    for(i=head[u];i!=-1;i=edge[i].next){
        int v = edge[i].u;
        if(dist[v]==dist[u]+1&&edge[i].w){
            dd = dfs(v,min(edge[i].w,delta));
            edge[i].w -= dd;
            edge[i^1].w += dd;
            ret += dd;
            delta -= dd;
        }
    }
    return ret;
}
int main(){
    int i,j;
    int a,b,c;
    memset(head,-1,sizeof(head));
    scanf("%d%d",&n,&m);
    cnt = 0;
    src = 0;
    sink = n + 1;
    for(i=1;i<=n;i++){
        scanf("%d%d",&a,&b);
        add_edge(src,i,a);
        add_edge(i,src,0);
        add_edge(i,sink,b);
        add_edge(sink,i,0);
    }
    for(i=0;i<m;i++){
        scanf("%d%d%d",&a,&b,&c);
        add_edge(a,b,c);
        add_edge(b,a,c);
    }
    int ans = 0;
    while(bfs()){
        ans += dfs(src,INF);
    }
    printf("%d\n",ans);
    return 0;
}

POJ--3469--Dual Core CPU【Dinic】最小割

时间: 2024-10-05 23:55:03

POJ--3469--Dual Core CPU【Dinic】最小割的相关文章

POJ 3469 Dual Core CPU(最小割)

POJ 3469 Dual Core CPU 题目链接 题意:有a,b两台机器,有n个任务,在a机器和b机器需要不同时间,给定m个限制,如果u, v在不同机器需要额外开销,问最小开销 思路:最小割,源点为a机器,汇点为b机器,这样的话求出最小割,就是把点分成两个集合的最小代价,然后如果u, v在不同机器需要开销,则连u,v v,u两条边,容量为额外开销,这样如果这条边是割边,则a,b会在不同集合,并且代价就会被加上去 代码: #include <cstdio> #include <cst

POJ 3469 --Dual Core CPU【最小割】

Dual Core CPU Time Limit: 15000MS   Memory Limit: 131072K Total Submissions: 20852   Accepted: 9010 Case Time Limit: 5000MS Description As more and more computers are equipped with dual core CPU, SetagLilb, the Chief Technology Officer of TinySoft Co

POJ - 3469 Dual Core CPU (最小割)

(点击此处查看原题) 题意介绍 在一个由核A和核B组成的双核CPU上执行N个任务,任务i在核A上执行,花费Ai,在核B上执行,花费为Bi,而某两个任务之间可能需要进数据交互,如果两个任务在同一个核上执行,那么数据交互将没有花费,如果在不同核上执行,将产生wi的花费,问将n个任务全部执行产生的最小花费 . 解题思路 题目要求将n个任务分配为两个不同的集合,使得执行n个任务总花费最少,这类的题目我们一般将其转化为最小割问题,即花费最小的代价将n个点分为两部分.建图如下: 1)由源点向每个任务建一条容

POJ 1637 Dual Core CPU 求最小割

据说这道题目是个很经典的题,好多人测最大流算法效率都是用的这题,只会dinic的弱菜第一法果断tle了,把vector改成数组了时候5s过. 下次什么时候学了isap在写一遍把 #include <cstdio> #include <cstring> #include <cmath> #include <algorithm> #include <climits> #include <string> #include <iostr

POJ 3469 Dual Core CPU (求最小割)

POJ 3469 Dual Core CPU 链接:http://poj.org/problem?id=3469 题意:有两个cpu,n个模块.每个模块运行在连个cpu上运行时间不同.有m对模块之间要进行信息交互,如果模块在同一个cpu,那么进行信息交互时不需要额外时间,否则要花额外的时间.问怎么样分配模块,能够使得花费的时间最少. 思路:要将模块分给两个cpu,同时要使得时间最少,其实就是求最小割.那么题目可以转化为求最大流. 代码: /* ID: [email protected] PROG

POJ 3469 Dual Core CPU(网络流之最小割)

题目地址:POJ 3469 建图思路:建源点与汇点,源点与CPU1相连,汇点与CPU2相连,对共享数据的之间连无向边. 我的ISAP过这题还是毫无时间压力的嘛... 代码如下: #include <iostream> #include <cstdio> #include <string> #include <cstring> #include <stdlib.h> #include <math.h> #include <ctyp

POJ 3469 Dual Core CPU 最大流

划分成两个集合使费用最小,可以转成最小割,既最大流. //#pragma comment(linker, "/STACK:1024000000,1024000000") #include<cstdio> #include<cstring> #include<cstdlib> #include<algorithm> #include<iostream> #include<sstream> #include<cm

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

Dual Core CPU Time Limit: 15000MS   Memory Limit: 131072K Total Submissions: 24830   Accepted: 10756 Case Time Limit: 5000MS Description As more and more computers are equipped with dual core CPU, SetagLilb, the Chief Technology Officer of TinySoft C

POJ 3469 Dual Core CPU

一堆任务分配到2个不同的芯片上运行,一个任务在不同芯片上运行的时间不一样,有一些任务组如果分配到不同的芯片上运行会产生额外的时间.... 用最小的费用将不同对象划分到两个集合 , 最小割问题 . 建图: 用源点汇点代表两个芯片 对某个任务 , 在 A 芯片上运行时间 t1 . 则从源点连一条 到 这个任务容量为 t1 的边 . 对 B 芯片上运行时间同理 如果两个任务间有联系,着再俩个任务间连边. 原问题就转化成了, 将图分成两部分,所切割的容量最少. 最小割==最大流 isap 解决 Dual

poj 3469 Dual Core CPU 最小割

题意: 有n个模块在A和B核组成的双核计算机上运行,各个模块在A,B核上的运行时间已知,另外有m个三元组(a,b,w),表示a模块和b模块如果不在一个核上运行要产生w的额外花销,求总的最小花销. 分析: 即把n个模块划分为两个集合,可用求最小割的方法解决. 代码: //poj 3469 //sep9 #include <iostream> #include <queue> #include <algorithm> using namespace std; const i