poj 3469(最小割)

原创 2016年06月02日 09:43:22

有一些模块(modules)和一个双核处理器,一个模块可以在任意一个核上处理,每个核对应每个模块有个开销。现在有一些模块间需要数据交换,如果需要数据交换的模块在一个核上处理,则不需要额外开销,否则需要加上一个开销。现在需要完成所有模块,问最小需要多少开销。

如果没有这个额外的开销,那么每个模块只要选择开销小的那个核就行了。额外的开销给选择加上了限制。

先讲讲我的错误思路:拿A,B两台机器分别作为源点和汇点,然后将n个模块拆成两个,即x->x',这样就形成了A->x->x'->B的模型了,拆开的x和x'之间赋无穷大,A->x和x'->B赋相应的花费即可,额外的开销就是a->b'和b->a'赋值为w即可。最后跑最大流,结果WA。。参考了别人的思路,发现我的建图有问题,因为x->x'之间赋了无穷大,说明这条边是不起作用的,这条边可以“穿梭自如”,很有可能A->x和x'->B都会被我们选中,所以WA也是自然而然的了。

看了别人的建图,确实解决了这个问题,不需要拆点,直接就是A->x->B即可,再根据额外的开销a->b和b->a建边即可。

#include <iostream>
#include <algorithm>
#include <queue>
#include <stack>
#include <math.h>
#include <stdio.h>
#include <string.h>
using namespace std;
#define MOD 1000000007
#define maxn 20010
#define maxm 1000000
#define LL  long long
struct Eg{
   int to;
   int next;
   int f;
}E[maxm];
int V[maxn],num;
int N,M;
void add(int u,int v,int c){
    E[num].to=v;
    E[num].f=c;
    E[num].next=V[u];
    V[u]=num++;

    E[num].to=u;
    E[num].f=0;
    E[num].next=V[v];
    V[v]=num++;
}
int level[maxn];
int qu[maxn];
bool BFS(int s,int t){
   int i,iq=0;
  for(i=0;i<=t;i++) level[i]=0;
   int u,v,e;
    qu[iq++]=s;
    level[s]=1;
    for(i=0;i<iq;i++){
      u=qu[i];
      if(u==t) return true;
      for(e=V[u];e!=-1;e=E[e].next){
        v=E[e].to;
        if(!level[v]&&E[e].f>0)
        {
            level[v]=level[u]+1;
            qu[iq++]=v;
        }
      }
   }
   return false;
}
int cur[maxn];
int dfs(int u,int maxf,int t){
    if(u==t||maxf==0) return maxf;
    int ret=0,f,e,v;
    for(e=cur[u];e!=-1;e=E[e].next){// 当前弧优化
         v=E[e].to;
         if(E[e].f>0&&level[u]+1==level[v]){
           f= dfs(v,min(maxf,E[e].f),t);
           E[e].f-=f;
           E[e^1].f+=f;
           maxf-=f;
           ret+=f;
           cur[u]=e;
           if(maxf==0) break;
        }
    }
    return ret;
}
int Dinic(int s,int t){
   int flow=0;
   while(BFS(s,t)){
     for(int i=0;i<=t;i++)
      cur[i]=V[i];
     flow+=dfs(s,MOD,t);
   }
   return flow;
}
int main(){
    int i;
    int a,b,w;
   while(scanf("%d %d",&N,&M)!=EOF){
    for(i=0;i<=N+1;i++)V[i]=-1;
    num=0;
    for(i=1;i<=N;i++){
        scanf("%d %d",&a,&b);
        add(0,i,a);
        add(i,N+1,b);
    }
    while(M--){
        scanf("%d %d %d",&a,&b,&w);
        add(a,b,w);
        add(b,a,w);
    }
     printf("%d\n",Dinic(0,N+1));
   }

   return 0;
}


Dual Core CPU POJ - 3469 最小割(经典网络流)

传送门:POJ3469 题意:  要在核A和核B组成的双核CPU上运行N个模块,模块i在核A上执行的花费为Ai,在核B上执行的花费为Bi。有M个相互之间需要进行数据交换的模块组合(ai,bi),如果...

(POJ3469)Dual Core CPU 网络流最小割,Dinic模板应用

Dual Core CPU Time Limit: 15000MS Memory Limit: 131072K Total Submissions: 22723 Accepte...

poj3469Dual Core CPU(ISAP求最小割)

题目请戳这里 题目大意:n个工作,2个CPU,每个工作都可以工作在2个CPU上,并且对于工作i,在第一个CPU上工作的代价为ai,在第二个CPU上工作的代价是bi,再给m对工作,每对工作有数据交换,...

POJ 3469 Dual Core CPU 最小割问题

链接:http://poj.org/problem?id=3469 题意:给出多个任务在两个处理器分别处理时的花费,给出一些条件有些任务在不同的处理器处理会有额外的花费,问最小的花费是多少。 ...

poj 3469 Dual Core CPU (最小割->最大流)

这题不难,很容易建立最小割模型,然后就是最大流啦。顺便贴上我的SAP模板,此模板是我参考了网上众牛的模板写的,集各种优化于一身。#include #include #include #inclu...
  • ahfywff
  • ahfywff
  • 2012年02月06日 15:44
  • 454

poj 3469 Dual Core CPU(最小割)

Description As more and more computers are equipped with dual core CPU, SetagLilb, the Chief Techno...

poj 3469 Dual Core CPU 最小割

题意: 有n个模块在A和B核组成的双核计算机上运行,各个模块在A,B核上的运行时间已知,另外有m个三元组(a,b,w),表示a模块和b模块如果不在一个核上运行要产生w的额外花销,求总的最小花销。 ...
  • sepNINE
  • sepNINE
  • 2015年01月23日 17:47
  • 613

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

链接:http://poj.org/problem?id=3469 题意:有一个双核CPU,有n个模块需要在cpu上处理,在两个核上运行的耗费分别是Ai和Bi,m对模块需要共享数据,如果它们运行在同一...
  • zzzz40
  • zzzz40
  • 2014年08月13日 03:59
  • 705

POJ 3469 构图最小割+链表SAP

题目大意: 有一台双核处理器的电脑,现有很多模块,每个模块放在不同的核中都有一个花销。若某两个模块不放在同一个核中执行,那么会产生额外的花销。 求出使得所有的模块都进入处理器中的总花销值最小。 ...

poj 3469 Dual Core CPU 最大流-最小割

题目:http://poj.org/problem?id=3469 题意:有双核处理器,有n个任务,给出每个任务在分别在两个处理核心上工作的花费,然后有m行,每行给出两个任务,如果两个任务不在同一个处...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:poj 3469(最小割)
举报原因:
原因补充:

(最多只允许输入30个字)