POJ2135 最小费用最大流模板题

练练最小费用最大流

此外此题也是一经典图论题

题意:找出两条从s到t的不同的路径,距离最短。

  要注意:这里是无向边,要变成两条有向边

#include <cstdio>
#include <cstring>
#define MAXN 1005
#define MAXM 10005
#define INF 0x3f3f3f3f

struct Edge
{
    int y,c,w,ne;//c容量 w费用
}e[MAXM*4];

int n,m,x,y,w;
int s,t,Maxflow,Mincost;
int all,be[MAXN];
int q[MAXM*4],dis[MAXN],pre[MAXN];//pre存的是当前点的前边
bool vis[MAXN];

void add(int x, int y, int c, int cost)
{
    e[all].y=y;e[all].c=c;e[all].w=cost;
    e[all].ne=be[x];
    be[x]=all++;
    e[all].y=x;e[all].c=0;e[all].w=-cost;//反向边费用取负
    e[all].ne=be[y];
    be[y]=all++;
}

void init()
{
    all=0;
    memset(be,-1,sizeof(be));
}
bool spfa(int s, int t)
{
    for(int i=0; i<MAXN; i++)
    {
        dis[i]=INF;
        vis[i]=0;
        pre[i]=-1;
    }
    dis[s]=0;
    vis[s]=1;
    int head=0,tail=0;
    q[++tail]=s;
    while(head<tail)
    {
        int u=q[++head];
        vis[u]=0;
        for(int i=be[u]; i!=-1; i=e[i].ne)
        {
            int v=e[i].y;
            if(e[i].c>0 && dis[v]>dis[u]+e[i].w)
            {
                dis[v]=dis[u]+e[i].w;
                pre[v]=i;
                if(!vis[v])
                {
                    vis[v]=1;
                    q[++tail]=v;
                }
            }
        }
    }
    if(pre[t]==-1) return 0;
    return 1;
}
void MincostMaxflow(int s, int t)
{
    Maxflow=0;
    Mincost=0;
    while(spfa(s,t))
    {
        int minc=INF;
        for(int i=pre[t]; i!=-1; i=pre[e[i^1].y])
            if(minc>e[i].c) minc=e[i].c;
        for(int i=pre[t]; i!=-1; i=pre[e[i^1].y])
        {
            e[i].c-=minc;
            e[i^1].c+=minc;
            Mincost+=e[i].w*minc;
        }
        Maxflow+=minc;
    }
}

int main()
{
    scanf("%d%d",&n,&m);
    init();
    s=n+1;
    t=n+2;
    for(int i=0; i<m; i++)
    {
        scanf("%d%d%d",&x,&y,&w);
        add(x,y,1,w);
        add(y,x,1,w);
    }
    add(s,1,2,0);
    add(n,t,2,0);
    MincostMaxflow(s,t);
    printf("%d\n",Mincost);
    return 0;
}

POJ2135 最小费用最大流模板题

时间: 2024-11-07 16:36:05

POJ2135 最小费用最大流模板题的相关文章

【网络流#2】hdu 1533 最小费用最大流模板题

嗯~第一次写费用流题... 这道就是费用流的模板题,找不到更裸的题了 建图:每个m(Man)作为源点,每个H(House)作为汇点,各个源点与汇点分别连一条边,这条边的流量是1(因为每个源点只能走一条边到汇点),费用是 从源点走到汇点的步数,因为有多个源点与汇点,要建一个超级源点与超级汇点,超级源点与各个源点连一条流量为1,费用为0(要避免产生多余的费用)的边 按照这个图跑一发费用流即可 把代码挂上去,用的是前向星写的 1 #include<cstdio> 2 #include<cstr

[POJ2135]最小费用最大流

一直由于某些原因耽搁着...最小费用最大流没有搞会. 今天趁着个人状态正佳,赶紧去看看,果然30min不到看会了算法+模板并且A掉了一道题. 感觉最小费用最大流在学过了最大流之后还是挺好理解的.找到从起点到终点流过1单位流量的最小花费方案,然后更新数据. 不停地找增广路,不停累计答案,不停趋近最优解. 理解起来没有任何问题.代码书写一遍就过了很顺利. POJ2135 实际上是一道并不那么容易套的模板题. 网络流的题目重在建模.这道题就是这样. 求起点到终点往返的最短路径,但不能经过相同的边. 往

POJ2135Farm Tour(最小费用最大流模板)

题目链接:http://poj.org/problem?id=2135 题意:农场主想从1到n,然后从n到1,每条边最多走一次,不能走重复的路,问最短距离是多少. 建图:取超级源点s,并与房子连一条边,容量为2,费用为0:取barn与超级汇点 t 的边的容量为2,费用为0 房子与barn的费用为距离,容量为1 #include <iostream> #include <cstdlib> #include <cstdio> #include <cstring>

poj 2135 Farm Tour (最小费用最大流模板)

网络流的费用: 在实际应用中,与网络流有关的问题,不仅涉及流量,而且还有费用的因素.网络的每一条边(v,w)除了给定容量cap(v,w)外,还定义了一个单位流量费用cost(v,w) 最小费用最大流问题 给定网络G,要求G的一个最大用流flow,使流的总费用最小. 求解MCMF问题的算法: 最小费用最大流最常用和基本的算法我们可以称它为最小费用路算法,其思想与求最大流的增广路算法类似,不断在残流网络中寻找从源s到汇t的最小费用路,即残流网络中从s到t的以费用为权的最短路,然后沿最小费用路增流,直

poj2135最小费用最大流经典模板题

Farm Tour Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 13509   Accepted: 5125 Description When FJ's friends visit him on the farm, he likes to show them around. His farm comprises N (1 <= N <= 1000) fields numbered 1..N, the first of

HDU 1533--Going Home【最小费用最大流 &amp;&amp; 模板】

Going Home Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 3452    Accepted Submission(s): 1771 Problem Description On a grid map there are n little men and n houses. In each unit time, every

poj 2195 最小费用最大流模板

/*Source Code Problem: 2195 User: HEU_daoguang Memory: 1172K Time: 94MS Language: G++ Result: Accepted Source Code */ #include <iostream> #include <stdio.h> #include <queue> #include <math.h> #include <string.h> using namespa

Doctor NiGONiGO’s multi-core CPU(最小费用最大流模板)

题目链接:http://acm.nyist.net/JudgeOnline/problem.php?pid=693 题意:有一个 k 核的处理器和 n 个工作,全部的工作都须要在一个核上处理一个单位的时间,每一个核在不同一时候间处理同一个工作的花费是递增的,每一个核一次仅仅能处理一个工作,求运用k个核处理这n个工作的最小花费. 分析: 分析可知,求处理全部工作的最小花费,而每次选择怎么处理我们能够通过容量都为1的边来让网络流处理,这样就转化为最小费用最大流. 首先设一个超级源点s,连接全部的工作

hdu 1533 Going Home 最小费用最大流 入门题

Going Home Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 3125    Accepted Submission(s): 1590 Problem Description On a grid map there are n little men and n houses. In each unit time, every