Pagini recente » Cod sursa (job #1820887) | Cod sursa (job #3266016) | Cod sursa (job #982055) | Cod sursa (job #2089539) | Cod sursa (job #565373)
Cod sursa(job #565373)
#include<string.h>
#include<vector>
#include<fstream>
#define INF 0x3f3f3f
#define MAX 1001
using namespace std;
int C[MAX][MAX],F[MAX][MAX],T[MAX],N,M;
vector<int> G[MAX];
int bf(int S,int D)
{
int p,u,Q[MAX],nod;
p = u = 1;
memset(T, 0, sizeof(T));
Q[p] = S;
T[S] = -1;
vector<int>::iterator it;
while(p<=u)
{
nod = Q[p];
if(nod == D){++p;continue;}
for(it = G[nod].begin();it!=G[nod].end();++it)
if(!T[(*it)] && C[nod][(*it)] > F[nod][(*it)])
{
Q[++u] = (*it);
T[(*it)] = nod;
}
++p;
}
return T[D];
}
int minim(int a,int b)
{
if(a<=b)return a;
return b;
}
int main()
{
ifstream f("maxflow.in");
f>>N>>M;
int i,x,y,c;
for(i=1;i<=M;++i)
{
f>>x>>y>>c;
C[x][y] = c;
G[x].push_back(y);
G[y].push_back(x);
}
f.close();
int flux = 0,r,nod;
while(bf(1,N))
{
for(vector<int>::iterator it = G[N].begin();it!=G[N].end();++it)
{
T[N] = (*it);
r = INF;
nod = N;
while(nod!=1)
{
r = minim(r, C[T[nod]][nod] - F[T[nod]][nod]);
nod = T[nod];
}
nod = N;
while(nod!=1)
{
F[T[nod]][nod] += r;
F[nod][T[nod]] -= r;
nod = T[nod];
}
flux+=r;
}
}
ofstream g("maxflow.out");
g<<flux<<"\n";
g.close();
return 0;
}