您的位置:首页 > 理论基础 > 计算机网络

hihocoder 1369 网络流之最大流

2016-11-02 21:13 357 查看
题目链接: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
;
Update(flow
);
mem(vis , 0);mem(path , -1);mem(flow , 0);
}
printf("%d\n" , ans);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: