Pagini recente » Cod sursa (job #2889505) | Cod sursa (job #1536683) | Cod sursa (job #564384) | Cod sursa (job #2549121) | Cod sursa (job #1411722)
#include <cstdio>
#include <vector>
#include <algorithm>
#include <cstring>
#include <bitset>
#include <queue>
#define Nmax 1055
#define Emax 5000
#define INF 0x3f3f3f3f
using namespace std;
int N,M,S,D;
vector<int> G[Nmax],sol;
bitset<Nmax> used;
int flow[Nmax][Nmax],capacity[Nmax][Nmax],daddy[Nmax];
queue<int> Q;
void Read()
{
scanf("%d%d",&N,&M);
int a,b,c;
for(int i = 1; i <= M; ++i)
{
scanf("%d%d%d",&a,&b,&c);
capacity[a][b] = c;
G[a].push_back(b);
G[b].push_back(a);
}
}
bool BFS(int k)
{
used = 0;
used[k] = 1;
Q.push(k);
while(!Q.empty())
{
k = Q.front(); Q.pop();
if(k == D) continue;
for(vector<int>::iterator it = G[k].begin(); it != G[k].end(); ++it)
if(!used[*it] && capacity[k][*it] != flow[k][*it])
{
int v = *it;
used[*it] = 1;
daddy[*it] = k;
Q.push(*it);
}
}
return used[D];
}
int FLOW(int k)
{
int minFLOW,maxFLOW = 0;
while(BFS(k))
for(vector<int>::iterator it = G[D].begin(); it != G[D].end(); ++it)
{
if(capacity[*it][D] == flow[*it][D] || !used[*it])
continue;
daddy[D] = *it;
minFLOW = INF;
for(int nodc = D; nodc != S; nodc = daddy[nodc])
minFLOW = min(minFLOW,capacity[daddy[nodc]][nodc] - flow[daddy[nodc]][nodc]);
for(int nodc = D; nodc != S; nodc = daddy[nodc])
{
flow[daddy[nodc]][nodc] += minFLOW;
flow[nodc][daddy[nodc]] -= minFLOW;
}
maxFLOW += minFLOW;
}
return maxFLOW;
}
void DFS(int k)
{
used[k] = 1;
for(vector<int>::iterator it = G[k].begin(); it != G[k].end(); ++it)
if(!used[*it] && capacity[k][*it] != flow[k][*it])
DFS(*it);
}
void Solve()
{
S = 1;
D = N;
printf("%d\n",FLOW(S));
}
int main()
{
freopen("maxflow.in","r",stdin);
freopen("maxflow.out","w",stdout);
Read();
Solve();
return 0;
}