HDU - 1532 Drainage Ditches解题报告(网络流 最大流魔板题)

题目大意:

这些英文题真是有点长,意思我也是读个半懂不懂,但是好像就应该是一个魔板题。给你 n(200)个点 m(200)条边,然后就是问你求一个从 1 号点到 n 号点的最大流。
没有什么巧妙建图的需要。第一次直接套魔板真是爽,但是要记住每组测试数据之间需要初始化。

代码:

#include<iostream>
#include<math.h>
#include<stdio.h>
#include<string.h>
#include<vector>
#include<queue>
#define maxn 510
#define inf 0x3f3f3f3f

using namespace std;

struct Edge
{
    int s;int e;int v;
}a[maxn];


//int map[maxn][maxn]={0};

int n,m;
//int map[maxn][maxn];
struct edge
{
    int to,cap,rev;
};
vector<edge>G[maxn];
bool used[maxn];
void add_edge(int from,int to,int cap)
{
    G[from].push_back((edge){to,cap,G[to].size()});
    G[to].push_back((edge){from,0,G[from].size()-1});
}
int dfs(int v,int t,int f)
{
    if(v==t)return f;
    used[v]=true;
    for(int i=0;i<G[v].size();i++)
    {
        edge &e=G[v][i];
        if(!used[e.to]&&e.cap>0)
        {
            int d=dfs(e.to,t,min(f,e.cap));
            if(d>0)
            {
                e.cap-=d;
                G[e.to][e.rev].cap+=d;
                return d;
            }
        }
    }
    return 0;
}
int max_flow(int s,int t)
{
    int flow=0;
    while(1)
    {
        memset(used,0,sizeof(used));
        int f=dfs(s,t,inf);
        if(f==0)return flow;
        flow+=f;
    }
}


int main()
{
    while(scanf("%d%d",&m,&n)!=EOF)
    {
        memset(a,0,sizeof(a));
        //init(n);
        for(int i=0;i<maxn;i++)G[i].clear();
        for(int i=1;i<=m;i++)
        {
            int la,lb,lc;
            scanf("%d%d%d",&la,&lb,&lc);
            la--;lb--;
            add_edge(la,lb,lc);
            add_edge(lb,la,0);
        }
        printf("%d\n",max_flow(0,n-1));
    }
    return 0;
}
全部评论

相关推荐

06-26 18:30
门头沟学院 Java
据说名字越长别人越关注你的昵称我觉得我要被关注了:你问问这里面有多少是正经候选人,而不是乱打招呼的
点赞 评论 收藏
分享
牛客928043833号:在他心里你已经是他的员工了
点赞 评论 收藏
分享
05-19 19:57
蚌埠学院 Python
2237:Gpa70不算高,建议只写排名,个人技能不在多而在精,缩到8条以内。项目留一个含金量高的,减少间距弄到一页,硕士简历也就一页,本科不要写很多
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务