hihocoder 1369 网络流之最大流

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_24477135/article/details/53012601

题目链接:http://hihocoder.com/problemset/problem/1369


思路:每次找一条不停地能到达目的点的路(增广路),然后更新图的流量。 ,使用:Ford-Fulkerson算法


#include <iostream>
#include <cstdio>
#include <string>
#include <cstring>
#include <cmath>
#include <stack>
#include <queue>
#include <algorithm>
#include <vector>
#include <map>
#include <set>
#include <stdlib.h>
#include <iomanip>
#include <fstream>

using namespace std;
#pragma comment(linker, "/STACK:102400000,102400000")
#define maxn 505
#define MOD 1000000007
#define mod 2147493647
#define mem(a , b) memset(a , b , sizeof(a))
#define LL long long
#define ULL unsigned long long
#define FOR(i , n) for(int i = 1 ;  i<= n ; i ++)
typedef pair<int , int> pii;
int n , m;
vector<int>V[maxn];
int a[maxn][maxn] , path[maxn];
bool vis[maxn] ;
int flow[maxn];

bool GetAugmentPath()
{
    queue<int>q;
    while(!q.empty()) q.pop();
    q.push(1);vis[1] = 1;
    flow[1] = MOD;
    while(!q.empty())
    {
        int cur = q.front();
        q.pop();
        if(cur == n)
        {
            return 1;
        }
        for(int i = 0 ; i < V[cur].size() ; i ++)
        {
            if(!vis[V[cur][i]] && a[cur][V[cur][i]] > 0)
            {
                vis[V[cur][i]] = 1;
                path[V[cur][i]] = cur;
                flow[V[cur][i]] = min(a[cur][V[cur][i]] , flow[cur]);
                q.push(V[cur][i]);

            }
        }
    }
    return 0;
}

void Update(int num)
{
    int u = n , v = path[u];
    while(v != -1)
    {
        a[v][u] -= num;
      //  a[u][v] += num;
        u = v;
        v = path[u];
    }
    return ;
}

int main()
{
    while(scanf("%d %d" , &n , &m) != EOF)
    {
        for(int i = 0 ; i <= n ; i ++) V[i].clear();
        mem(a , 0);mem(vis , 0);mem(path , -1);mem(flow , 0);
        int u , v , c;
        for(int i = 0 ; i < m ; i ++)
        {
            scanf("%d %d %d" , &u , &v , &c);
            a[u][v] += c ;
          //  a[v][u] = max(0 , a[v][u]);
            V[u].push_back(v);
          //  V[v].push_back(u);
        }
        int ans = 0;
        while(GetAugmentPath())
        {
            ans += flow[n];
            Update(flow[n]);
            mem(vis , 0);mem(path , -1);mem(flow , 0);
        }
        printf("%d\n" , ans);
    }
    return 0;
}


猜你喜欢

转载自blog.csdn.net/qq_24477135/article/details/53012601