POJ 3469 Dual Core CPU ——网络流

【题目分析】

构造一个最小割的模型。

S向每一个点连Ai,每一个点向T连Bi。

对于每一个限制条件,在i和j之间连一条Cij的双向边即可。

然后求出最小割就是最少的花费。

验证最小割的合理性很容易。

【代码】

#include <cstdio>
#include <cstring>
#include <cmath>
#include <cstdlib>

//#include <map>
#include <set>
#include <queue>
#include <string>
#include <iostream>
#include <algorithm>

using namespace std;

#define maxn 50005
#define ll long long
#define me 400005
#define inf 0x3f3f3f3f
#define F(i,j,k) for (int i=j;i<=k;++i)
#define D(i,j,k) for (int i=j;i>=k;--i)

void Finout()
{
    #ifndef ONLINE_JUDGE
    freopen("in.txt","r",stdin);
//    freopen("out.txt","w",stdout);
    #endif
}

int Getint()
{
    int x=0,f=1; char ch=getchar();
    while (ch<‘0‘||ch>‘9‘) {if (ch==‘-‘) f=-1; ch=getchar();}
    while (ch>=‘0‘&&ch<=‘9‘) {x=x*10+ch-‘0‘; ch=getchar();}
    return x*f;
}
int h[me<<1],to[me<<1],ne[me<<1],fl[me<<1],en=0,S=0,T=me-1;

void add(int a,int b,int c)
{
    to[en]=b; ne[en]=h[a]; fl[en]=c; h[a]=en++;
//    to[en]=a; ne[en]=h[b]; fl[en]=0; h[b]=en++;
}

int map[me];

bool tell()
{
    queue <int> q;
    memset(map,-1,sizeof map);
    map[S]=0;
    while (!q.empty()) q.pop();
    q.push(S);
    while (!q.empty())
    {
        int x=q.front(); q.pop();
        for (int i=h[x];i>=0;i=ne[i])
        {
            if (map[to[i]]==-1&&fl[i]>0)
            {
                map[to[i]]=map[x]+1;
                q.push(to[i]);
            }
        }
    }
    if (map[T]!=-1) return true;
    return false;
}

int zeng(int k,int r)
{
    if (k==T) return r;
    int ret=0;
    for (int i=h[k];i>=0&&ret<r;i=ne[i])
        if (map[to[i]]==map[k]+1&&fl[i]>0)
        {
            int tmp=zeng(to[i],min(fl[i],r-ret));
            ret+=tmp; fl[i]-=tmp; fl[i^1]+=tmp;
        }
    if (!ret) map[k]=-1;
    return ret;
}

int main()
{
    memset(h,-1,sizeof h);
    Finout();
    int n,m,a,b,c;
    n=Getint();m=Getint();
    F(i,1,n)
    {
        a=Getint(); b=Getint();
        add(S,i,a);
        add(i,S,0);
        add(i,T,b);
        add(T,i,0);
    }
    F(i,1,m)
    {
        a=Getint(); b=Getint();
        c=Getint();
        add(a,b,c);
        add(b,a,c);
    }
    int ans=0,tmp;
    while (tell()) while (tmp=zeng(S,inf)) ans+=tmp;
    cout<<ans<<endl;
}

  

时间: 2024-10-14 21:04:11

POJ 3469 Dual Core CPU ——网络流的相关文章

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 网络流

转化为最小割,dinic 1 #include<cstdio> 2 #include<cstring> 3 #include<vector> 4 #include<queue> 5 6 using namespace std; 7 8 const int maxn=20000+5; 9 const int inf=0x3f3f3f3f; 10 const int s=0; 11 int t; 12 13 inline int min(const int x,

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 (求最小割)

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 最大流

划分成两个集合使费用最小,可以转成最小割,既最大流. //#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【最小割】

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 最小割

题意: 有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