Pagini recente » Cod sursa (job #2942162) | Cod sursa (job #1424862) | Rating Podaru Mihai (XeBlue) | Cod sursa (job #1853802) | Cod sursa (job #564566)
Cod sursa(job #564566)
#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];
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;
if((*it) == D)return 1;
}
++p;
}
return 0;
}
int minim(int a,int b)
{
if(a<=b)return a;
return b;
}
int FLUX()
{
int flux,r,i;
for(flux = r = 0;bf(1,N);flux+=r)
{
r = INF;
i = N;
while(i!=1)
{
r = minim(r, C[T[i]][i] - F[T[i]][i]);
i = T[i];
}
i = N;
while(i!=1)
{
F[T[i]][i] += r;
F[i][T[i]] -= r;
i = T[i];
}
}
return flux;
}
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();
ofstream g("maxflow.out");
g<<FLUX()<<"\n";
g.close();
return 0;
}