Pagini recente » Istoria paginii runda/penultimainaintedeotv/clasament | Cod sursa (job #372822) | Istoria paginii runda/oji-2015-cls11-12124151/clasament | Istoria paginii blog/viata-dupa-olimpiade-2 | Cod sursa (job #695615)
Cod sursa(job #695615)
#include<stdio.h>
#include<vector>
#include<fstream>
#include<queue>
using namespace std;
ifstream f("maxflow.in");
ofstream g("maxflow.out");
typedef vector<int>::iterator it;
#define MaxN 1010
int N,M,fluxTotal;
int flux[MaxN][MaxN],T[MaxN],Min[MaxN];
vector<int> A[MaxN];
void citire(void)
{
int a,b,c;
f >> N >> M;
for(int i=1;i<=M;i++)
{
f >> a >> b >> c;
flux[a][b] += c;
A[a].push_back(b);
if(a != 1) A[b].push_back(a);
}
}
inline int MiN(int a,int b)
{
return a < b ? a : b;
}
inline int DF(void)
{
queue<int> Q;
for(int i=1;i<=N;i++)
T[i] = 0, Min[i] = 12319213;
for(Q.push(1);!Q.empty();Q.pop())
for(it i=A[Q.front()].begin();i<A[Q.front()].end();i++)
if(!T[*i] && flux[Q.front()][*i] > 0)
{
Q.push(*i);
T[*i] = Q.front();
Min[*i] = MiN(flux[Q.front()][*i],Min[Q.front()]);
if(*i == N)
{
return 1;
}
}
return 0;
}
void Flux(void)
{
for(;DF();)
{
for(int i=N;T[i];i=T[i])
{
flux[T[i]][i] -= Min[N];
flux[i][T[i]] += Min[N];
}
fluxTotal += Min[N];
}
}
int main()
{
citire();
Flux();
g << fluxTotal;
return 0;
}