最大流算法 Dinic HDU 1532

#include <iostream>
#include <cstring>
#include <queue>
#include <cstdio>

using namespace std;

#define V 205
#define E 205
#define INF 0x7ffffff

struct Edge
{
    int u, v, c, next;
} e[E<<2];

int n, m, s, t;
int d[V], head[V], cnt;

void adde(int u, int v, int c)
{
    e[cnt].u = u;
    e[cnt].v = v;
    e[cnt].c = c;
    e[cnt].next = head[u];
    head[u] = cnt++;

    e[cnt].u = v;
    e[cnt].v = u;
    e[cnt].c = 0;
    e[cnt].next = head[v];
    head[v] = cnt++;
}

int bfs()
{
    memset(d, -1, (n+3)*sizeof(int));
    d[s] = 0;
    queue<int> Q;
    Q.push(s);
    while(!Q.empty())
    {
        int u = Q.front();
        Q.pop();
        for(int i=head[u]; i!=-1; i=e[i].next)
        {
            int v = e[i].v;
            if(d[v]==-1 && e[i].c>0)
            {
                d[v] = d[u] + 1;
                Q.push(v);
            }
        }
    }
    return d[t] != -1;
}

int dfs(int x, int a)
{
    if(x==t || a==0) return a;
    int flow = 0, f;
    for(int i=head[x]; i!=-1 && flow<a; i=e[i].next)
    {
        int v = e[i].v;
        if(d[v]==d[x]+1 && e[i].c>0)
        {
            int t = min(e[i].c, a-flow);
            f = dfs(v, t);
            flow += f;
            e[i].c -= f;
            e[i^1].c += f;
        }
    }
    if(!flow)  d[x] = -2;
    return flow;
}

int dinic(int s, int t)
{
    int flow = 0, f;
    while(bfs())
    {
        while(f = dfs(s, INF))
            flow += f;
    }
    return flow;
}

int main()
{
    int u, v, c;
    while(~scanf("%d%d", &m, &n))
    {
        cnt = 0;
        memset(head, -1, (n + 3) * sizeof(int));
        s = 1;
        t = n;
        for(int i=0; i<m; i++)
        {
            scanf("%d%d%d", &u, &v, &c);
            adde(u, v, c);
        }

        printf("%d\n", dinic(1, n));
    }
    return 0;
}

时间: 2024-11-06 07:24:51

最大流算法 Dinic HDU 1532的相关文章

网络最大流算法—Dinic算法及优化

前置知识 网络最大流入门 前言 Dinic在信息学奥赛中是一种最常用的求网络最大流的算法. 它凭借着思路直观,代码难度小,性能优越等优势,深受广大oier青睐 思想 $Dinic$算法属于增广路算法. 它的核心思想是:对于每一个点,对其所连的边进行增广,在增广的时候,每次增广“极大流” 这里有别于EK算法,EK算法是从边入手,而Dinic算法是从点入手 在增广的时候,对于一个点连出去的边都尝试进行增广,即多路增广 Dinic算法还引入了分层图这一概念,即对于$i$号节点,用$dis(i)$表示它

HDU 1532 Drainage Ditches 最大排水量 网络最大流 Edmonds_Karp算法

题目链接:HDU 1532 Drainage Ditches 最大排水量 Drainage Ditches Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 9641    Accepted Submission(s): 4577 Problem Description Every time it rains on Farmer John

HDU 1532||POJ1273:Drainage Ditches(最大流)

Drainage Ditches Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 8574    Accepted Submission(s): 3991 Problem Description Every time it rains on Farmer John's fields, a pond forms over Bessie's

最大流算法(Edmons-Karp + Dinic 比较) + Ford-Fulkson 简要证明

Ford-Fulkson用EK实现:483ms #include <cstdio> #include <cstring> #define min(x,y) (x>y?y:x) int pre[105],q[105]; int F[105][105]; int n,nc,np,m,s,t,all; int MaxFlow(int s, int t){ int ans=0; while(1){ memset(pre,0,sizeof(pre)); int head=0,tail=

hdu 1532 poj 1273 Drainage Ditches (最大流)

Drainage Ditches Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 55276   Accepted: 21122 Description Every time it rains on Farmer John's fields, a pond forms over Bessie's favorite clover patch. This means that the clover is covered by

最大流算法

Edmonds-Karp算法(Ford-Fulkerson方法):最大流问题 - kuangbin - 博客园 dinic:网络流入门—用于最大流的Dinic算法 | Comzyh的博客

最小生成树之 prim算法和kruskal算法(以 hdu 1863为例)

最小生成树的性质 MST性质:设G = (V,E)是连通带权图,U是V的真子集.如果(u,v)∈E,且u∈U,v∈V-U,且在所有这样的边中, (u,v)的权c[u][v]最小,那么一定存在G的一棵最小生成树,(u,v)为其中一条边. 构造最小生成树,要解决以下两个问题: (1).尽可能选取权值小的边,但不能构成回路(也就是环). (2).选取n-1条恰当的边以连接网的n个顶点. Prim算法的思想: 设G = (V,E)是连通带权图,V = {1,2,-,n}.先任选一点(一般选第一个点),首

最大流之dinic

先用bfs预处理出层次图,然后在层次图上用dfs找增广路径,理论复杂度O(n*n*m) const int INF=0xfffffff ; struct node{ int s,t,cap,nxt ; }e[200005] ; int m,n,head[10005],level[10005],cnt ; void add(int s,int t,int cap) { e[cnt].s=s ;e[cnt].t=t ;e[cnt].cap=cap ;e[cnt].nxt=head[s] ;head[

Cable TV Network 顶点连通度 (最大流算法)

Cable TV Network 题目抽象:给出含有n个点顶点的无向图,给出m条边.求定点联通度   K 算法:将每个顶点v拆成 v'   v''  ,v'-->v''的容量为1.           对于原图中的边(u,v)   连边   u''--->v'    v''-->u'.    求每对定点的P(u,v);以u为源点,v为汇点. 我们只需固定一个顶点,枚举其它汇点. 1 #include <iostream> 2 #include <cstdio> 3