hihocoder 1369 网络流之最大流

来源:互联网 发布:淘宝全球购有什么好处 编辑:程序博客网 时间:2024/05/15 05:48

题目链接: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;}


0 0
原创粉丝点击