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;
}
思路:每次找一条不停地能到达目的点的路(增广路),然后更新图的流量。 ,使用: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;
}
相关文章推荐
- [HihoCoder1369]网络流一·Ford-Fulkerson算法
- hihoCoder 网络流五·最大权闭合子图 (网络流学习#5 记录)
- hihocoder1398 网络流五之最大权闭合子图
- hihocoder 1398 : 网络流五·最大权闭合子图
- 【hihocoder 1369】网络流一·Ford-Fulkerson算法
- [HihoCoder1398]网络流五·最大权闭合子图
- hihocoder 1369: 网络流一·Ford-Fulkerson算法
- [最大流/Edmonds-karp算法]hiho1369 网络流一
- hihocoder1378 网络流之最大流最小割
- HihoCoder 1398 网络流 - 最大权闭合子图
- 网络流五·最大权闭合子图 HihoCoder - 1398
- hihoCoder 1369 网络流一·Ford-Fulkerson算法 (网络流学习#1 记录)
- [POJ1273]Drainage Ditches 网络流(最大流)
- 最大网络流
- hihocoder-1393 二分图的多重匹配(网络流做法)
- UVa563_Crimewave(网络流/最大流)(小白书图论专题)
- Geeks Ford-Fulkerson Algorithm for Maximum Flow Problem 最大网络流问题
- hihoCoder 1393 网络流三·二分图多重匹配 (网络流学习#3 记录)
- 网络流最大流(代码)(Edmond-Karp算法)
- [caioj 1115] 网络流入门1 --- dinic最大流