HDU-3549 最大流模板题

1、HDU-3549   Flow Problem

2、链接:http://acm.hdu.edu.cn/showproblem.php?pid=3549

3、总结:模板题,参考了 http://www.cnblogs.com/Lyush/archive/2011/08/08/2130660.html  ,里面有几种模板,没太看懂

题意:给定有向图,求第1到第n个点的最大流。

#include<iostream>
#include<cstring>
#include<cmath>
#include<queue>
#include<algorithm>
#include<cstdio>
using namespace std;
#define LL long long
#define INF 0x3f3f3f3f
const int N=100100;

int mapn[20][20],flow[20][20];     //mapn存储边最大容量,flow存储边实际容量
int path[20],pre[20];       //path存储当前结点流量,pre存储父亲路径
int n,m;

int bfs()
{
    memset(path,0,sizeof(path));
    memset(pre,0,sizeof(pre));

    queue<int>q;
    q.push(1);
    int pos;
    path[1]=INF;    //下面要比较到path[1]
    while(!q.empty())
    {
        pos=q.front();
        q.pop();
        for(int i=1;i<=n;i++)
        {
            if(!path[i]&&flow[pos][i]<mapn[pos][i]){
                //如果这条边没有饱和或者形成了回流,就更新当前结点的流量

                path[i]=min(path[pos],mapn[pos][i]-flow[pos][i]);
                //即path[i]要取这条增广路径上残余流量的最小值

                pre[i]=pos;     //记录下父亲路径
                q.push(i);
            }
        }
    }

    return path[n];
}

int Max_Flow()
{
    int ans=0,pos,path_n;
    memset(flow,0,sizeof(flow));

    while(true)
    {
        path_n=bfs();      //每一次bfs获得一条增广路径
        if(!path_n)return ans;      //如果找不到增广路径就跳出
        pos=n;
        while(pos!=1){     //更新flow
            flow[pre[pos]][pos]+=path_n;
            flow[pos][pre[pos]]-=path_n;
            pos=pre[pos];
        }
        ans+=path_n;
    }

}

int main()
{
    int t;
    scanf("%d",&t);
    for(int test=1;test<=t;test++)
    {
        memset(mapn,0,sizeof(mapn));
        scanf("%d%d",&n,&m);
        int x,y,c;
        while(m--){
            scanf("%d%d%d",&x,&y,&c);
            mapn[x][y]+=c;
        }

        int max_flow;
        max_flow=Max_Flow();
        printf("Case %d: %d\n",test,max_flow);

    }

    return 0;
}

时间: 2024-12-13 16:22:03

HDU-3549 最大流模板题的相关文章

hdu 3549 最大流入门题

题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=3549 [科普]什么是BestCoder?如何参加? Flow Problem Time Limit: 5000/5000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others) Total Submission(s): 8862    Accepted Submission(s): 4168 Problem Description

HDU 1532 最大流模板题

题目:http://acm.hdu.edu.cn/showproblem.php?pid=1532 最近在学网络流,学的还不好,先不写理解了,先放模板... 我觉得写得不错的博客:http://blog.csdn.net/smartxxyx/article/details/9293665/ 1 #include<stdio.h> 2 #include<string.h> 3 #include<vector> 4 #define maxn 222 5 #define in

hdu 3549 Flow Problem(最大流模板题)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3549 Problem Description Network flow is a well-known difficult problem for ACMers. Given a graph, your task is to find out the maximum flow for the weighted directed graph. Input The first line of input

[ACM] hdu 3549 Flow Problem (最大流模板题)

Flow Problem Problem Description Network flow is a well-known difficult problem for ACMers. Given a graph, your task is to find out the maximum flow for the weighted directed graph. Input The first line of input contains an integer T, denoting the nu

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

POJ 3528 hdu 3662 三维凸包模板题

POJ 3528题:http://poj.org/problem?id=3528 HDU 3662:http://acm.hdu.edu.cn/showproblem.php?pid=3662 一个是求三维凸包面数,一个是求三维凸包表面积,都是很裸的. 贴代码: #include<stdio.h> #include<algorithm> #include<string.h> #include<math.h> #include<stdlib.h>

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

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

洛谷P3381——费用流模板题

嗯..随便刷了一道费用流的模板题....来练练手. #include<iostream> #include<cstdio> #include<cstring> using namespace std; int h[5210],d[5210],used[5210],que[100010],last[5210]; int k=1,INF=0x7fffffff,ans1=0,ans2=0; inline int read(){ int t=1,num=0; char c=ge

HDU 1251 Trie树模板题

1.HDU 1251 统计难题  Trie树模板题,或者map 2.总结:用C++过了,G++就爆内存.. 题意:查找给定前缀的单词数量. #include<iostream> #include<cstring> #include<cmath> #include<queue> #include<algorithm> #include<cstdio> #define max(a,b) a>b?a:b #define F(i,a,b