poj1273最大流dinc

bfs 构建层次图,dfs 寻找增广路。dfs在寻找增广路的同时自我调整直到此时的层次图无增广路时 重新构图,直到无增广路为止。

对于添加反弧,觉得对于每点 进流量和 出流量应该守恒,反向弧的添加方便自我调整,而通过每点的流量没变,最后导致流到终点的流量不变。

#include <cstdio>
#include <cstring>
#include <algorithm>
#include <climits>
#include <string>
#include <iostream>
#include <map>
#include <cstdlib>
#include <list>
#include <set>
#include <queue>
#include <stack>
using namespace std;

const int maxn= 222;
const int INF=0xfffffff;
int Min(int a,int b)
{
    return a>b?b:a;
}
int Map[maxn][maxn];
int n;int m;
int l[maxn];
int s;int e;
bool  bfs()
{
    queue<int > q;
    q.push(s);
    memset(l,0,sizeof(l));
    l[s]=1;
    while(!q.empty()){
        int cur=q.front(); q.pop();
         for(int i=1;i<=m;i++){
            if(!l[i]&&Map[cur][i]){
                l[i]=l[cur]+1;
                q.push(i);
            }
         }
    }
    return l[e];
}

int dfs(int x,int val)
{
    int tem=val;
    if(x==e) return val;
    for(int i=1;i<=m&&tem;i++){
        if(l[i]==l[x]+1&&Map[x][i]){
            int t=dfs(i,Min(Map[x][i],tem));
            Map[x][i]-=t;Map[i][x]+=t;
            tem-=t;
        }
    }
    return val-tem;
}

int solve()
{
    int ans=0;int t;
    while(bfs()){
        while(t= dfs(1,INF)){
            ans+=t;
        }
    }
    return ans;
}
int main()
{
    while(cin>>n>>m){
        int a;int b;int c;
        memset(Map,0,sizeof(Map));
        for(int i=0;i<n;i++){
            cin>>a>>b>>c; Map[a][b]+=c;
        }
        s=1;e=m;
        cout<<solve()<<endl;
    }
    return 0;
}

poj1273最大流dinc

时间: 2024-10-08 13:51:44

poj1273最大流dinc的相关文章

POJ1273 最大流 EK算法

套了个EK的模板 //#pragma comment(linker, "/STACK:16777216") //for c++ Compiler #include <stdio.h> #include <iostream> #include <climits> #include <cstring> #include <cmath> #include <stack> #include <queue> #i

POJ1273 最大流模板

之前自己写的,以后当一个模板的基础吧,不管是最大流,最小割,二分图匹配 下面是POJ1273的一个裸题.. 1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <vector> 5 #include <queue> 6 using namespace std; 7 struct node{ 8 int to,cap,rev; 9 node(int _t

POJ1273(最大流)

Drainage Ditches Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 70451   Accepted: 27391 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

POJ1273 最大流EK 裸题

1 #include <cstdio> 2 #include <cstring> 3 #include <queue> 4 #include <algorithm> 5 using namespace std; 6 int n,m; 7 const int maxn = 205; 8 int c[maxn][maxn],flow[maxn][maxn]; 9 int vis[maxn],fa[maxn]; 10 int largest_flow(int s,

poj1273 Drainage Ditches(裸最大流)

Drainage Ditches Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Drainage Ditches Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Submit Status Description Every time it rains on Farmer Joh

[笔记] 网络流-最大流 POJ-1273\HDU-4240

[1] POJ-1273 题目:http://poj.org/problem?id=1273 最直接的最大流问题,用了Ford-Fulkerson方法,DFS随机搜索增广路. 算法原理参考:http://blog.csdn.net/smartxxyx/article/details/9293665 /************************ POJ-1273* Ford-Fulkerson***********************/#include <stdio.h> #inclu

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

最大流的理解以及dinic模板 poj1273

增广路以及残留网络的定义不再赘述了.算导上说的很清楚,证明也有,看懂了就知道怎么求最大流了. 而算导上提到的FF方法以及ek算法的伪代码中都是将流与残留容量分开储存,其实代码实现的时候我们只需存正反向弧的残留容量即可. 然后是对残留网络的一些理解,残留网络中的反向弧是怎么来的? 残留网络的每条边都是这条有向边的残留容量,而残留容量又由公式cf(u,v)=c(u,v)-f(u,v)得到,那么对于一条不存在的有向边(v,u),其容量c(v,u)=0,f(v,u)=-f(u,v)通过反对称性可知,那么

poj-1273 Drainage Ditches(最大流基础题)

题目链接: Drainage Ditches Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 67475   Accepted: 26075 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 cover