最小割经典题(两个点依附在一起的情况)poj3469

Dual Core CPU

Time Limit: 15000MS   Memory Limit: 131072K
Total Submissions: 25099   Accepted: 10866
Case Time Limit: 5000MS

Description

As more and more computers are equipped with dual core CPU, SetagLilb, the Chief Technology Officer of TinySoft Corporation, decided to update their famous product - SWODNIW.

The routine consists of N modules, and each of them should run in a certain core. The costs for all the routines to execute on two cores has been estimated. Let‘s define them as Ai and Bi. Meanwhile, M pairs of modules need to do some data-exchange. If they are running on the same core, then the cost of this action can be ignored. Otherwise, some extra cost are needed. You should arrange wisely to minimize the total cost.

Input

There are two integers in the first line of input data, N and M (1 ≤ N ≤ 20000, 1 ≤ M ≤ 200000) .
The next N lines, each contains two integer, Ai and Bi.
In the following M lines, each contains three integers: a, b, w. The meaning is that if module a and module b don‘t execute on the same core, you should pay extra w dollars for the data-exchange between them.

Output

Output only one integer, the minimum total cost.

Sample Input

3 1
1 10
2 10
10 3
2 3 1000

Sample Output

13
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=20080;
int head[N],tot,S,T;
int q[N],dis[N],n,m;
int mp[N][22];
struct node
{
    int next,v,w;
} e[N*100];
void add(int u,int v,int w)
{
    e[tot].v=v;
    e[tot].w=w;
    e[tot].next=head[u];
    head[u]=tot++;
}
bool bfs()
{
    memset(dis,-1,sizeof(dis));
    dis[S]=0;
    int l=0,r=0;
    q[r++]=S;
    while(l<r)
    {
        int u=q[l++];
        for(int i=head[u]; ~i; i=e[i].next)
        {
            int v=e[i].v;
            if(dis[v]==-1&&e[i].w>0)
            {
                q[r++]=v;
                dis[v]=dis[u]+1;
                if(v==T) return true;
            }
        }
    }
    return false;
}
int dfs(int s,int low)
{
    if(s==T||!low) return low;
    int ans=low,a;
    for(int i=head[s]; ~i; i=e[i].next)
    {
        if(e[i].w>0&&dis[e[i].v]==dis[s]+1&&(a=dfs(e[i].v,min(e[i].w,ans))))
        {
            e[i].w-=a;
            e[i^1].w+=a;
            ans-=a;
            if(!ans) return low;
        }
    }
    if(low==ans) dis[s]=-1;
    return low-ans;
}
int main()
{
    scanf("%d%d",&n,&m);S=0,T=n+1;
    memset(head,-1,sizeof(head));
    tot=0;
    int x,y,u,v,w;
    for(int i=1;i<=n;++i) {
        scanf("%d%d",&x,&y);
        add(S,i,x);add(i,S,0);
        add(i,T,y);add(T,i,0);
    }
    for(int i=1;i<=m;++i) {
        scanf("%d%d%d",&u,&v,&w);
        add(u,v,w);
        add(v,u,w);
    }
    int ans=0;
    while(bfs()) ans+=dfs(S,99999999);
    printf("%d\n",ans);
}
时间: 2024-11-10 13:51:51

最小割经典题(两个点依附在一起的情况)poj3469的相关文章

【LA 3487】Duopoly(图论--网络流最小割 经典题)

题意:一个公司有一些资源,每种只有1割,有A.B两个公司分别对其中一些资源进行分组竞标.问卖资源的公司的最大收益. 解法:最小割.将A公司的竞标与源点相连,B公司的与汇点相连,边容量为竞标价.而A.B公司的竞标中有资源冲突的竞标之间连一条边,容量为INF.这样的最大收益就是 总竞标出价-割去竞标的边的价格的最小值. 问题!!dinic函数那里,我竟然2种打法相差了近乎3秒,也就是dfs函数流了很多次...(?Д?≡?Д?) 1 #include<cstdio> 2 #include<cs

【LA3487】最小割-经典模型 两种方法

题目链接 题意:A.B两个公司要买一些资源(他们自己买的资源不会重复),一个资源只能卖给一个公司.问最大收益. simple input 部分: 54 1 //买到1就给54元 15 2 33 3 2 4 5//买到4.5就给2元 题解:这道题是很经典的模型题,在这里给出两个方法. 方法一 把每个询问看成一个点,然后A的询问连源点,B的询问连汇点,如果AB间的某个询问有矛盾就在它们中间连一条无限大的边,ans=sum-最小割. // 方法一 把每个询问看成一个点,然后A的询问连源点,B的询问连汇

SPOJ 839 Optimal Marks 最小割 经典 按位建图

胡伯涛论文中的一题,经典建模,由于二进制每一位异或不会相互影响,所以我们把问题转换模型,按位处理. 即已知一些点的标号0/1(还有些可以自己任意改),和一些边,边权定义为两端点标号的异或,要求边权和最小的标号方案. 我们联想到最小割求的是从源到汇容量最小的边权和. 建图: 标号为1的和源点相连,容量INF,标号为0的和汇点相连,容量INF,这些边是不能割掉的(这些点标号已经明确) 原图相连的边,连边,容量为1.(若将此边割掉,则两端点一个为0,一个为1,割为1) 跑完最大流后,在残量网络中dfs

【BZOJ 3232】圈地游戏 二分+SPFA判环/最小割经典模型

最小割经典模型指的是“一堆元素进行选取,对于某个元素的取舍有代价或价值,对于某些对元素,选取后会有额外代价或价值”的经典最小割模型,建立倒三角进行最小割.这个二分是显然的,一开始我也是想到了最小割的那个模型的但是我觉得他会不是一个圈我就否掉了,但是仔细想想的话会发现,如果是这样的话所得到的答案一定小于等于一个圈的答案(浓度),所以我们可定会得到最终答案,所以这样做是可以的,所以说要有宽松得正解的意识(泥沙俱下但沙子不影响我泥).当时我否掉最小割以后就立马去想费用流了,然后想到建图后发现那样建图虽

Being a Hero (hdu 3251 最小割 好题)

Being a Hero Time Limit: 20000/10000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 1211    Accepted Submission(s): 381 Special Judge Problem Description You are the hero who saved your country. As promised, the ki

HDU 3657 Game(取数 最小割)经典

Game Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 1065    Accepted Submission(s): 449 Problem Description onmylove has invented a game on n × m grids. There is one positive integer on each g

最小割5题

S-T割将集合分为两个部分 1.Dual Core CPU http://poj.org/problem?id=3469 题目分析: 双核cpu,有n个的模块,给出第i个模块在第一个核运行的费用和在第二个核运行的费用.以及m对模块如果不在同一个核中运行要多耗费的费用.求最小费用 分析: 注:ai为第i个模块在第一个核运行的耗费,bi为第i个模块在第二个核运行的耗费 cpu的两个核分别当做源点和汇点,源点与模块i连一条边,容量为ai,i与汇点连一条边,容量为bi.对于有限制的模块,连边(u,v)(

hdoj--3046--Pleasant sheep and big big wolf(最小割经典)

 Pleasant sheep and big big wolf Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 2699    Accepted Submission(s): 1114 Problem Description In ZJNU, there is a well-known prairie. And it attrac

POJ2914 Minimum Cut【全局最小割】【Stoer-Wangner】

题目链接: http://poj.org/problem?id=2914 题目大意: 提一个无向有重边的图,有重边的边权累加起来,求全局最小割. 思路: 一个无向连通图,去掉一个边集可以使其变成两个连通分量则这个边集就是割集.最小割 集当然就是权和最小的割集. 这是一个最简单的全局最小割模板题.直接套上模板就可以了.来说说Stoer-Wangner算 法吧. Stoer-Wangner算法: 对于图中的任意两个顶点u和v,若u,v属于最小割的同一个集合中,那么僵顶点u和顶点 v合并后并不影响图的