Pagini recente » Cod sursa (job #658759) | Cod sursa (job #501614) | Cod sursa (job #507945) | Cod sursa (job #833631) | Cod sursa (job #443571)
Cod sursa(job #443571)
#include<cstdio>
#include<vector>
#include<bitset>
#include<queue>
using namespace std;
const int NMAX = 1001;
const int MMAX = 5001;
const int INF = 1000000000;
int N, M;
vector<int> V[NMAX];
int tata[NMAX];
int c[NMAX][NMAX];
int f[NMAX][NMAX];
int flux = 0;
void citeste()
{
int x, y, cost;
scanf("%d%d",&N,&M);
for(int i = 1 ; i <= M ; i++)
{
scanf("%d%d%d",&x,&y,&cost);
V[x].push_back(y);
V[y].push_back(x);
c[x][y] = cost;
}
}
int bfs()
{
bitset<NMAX> viz(false);
queue<int> Q;
int nod;
vector<int> :: iterator it;
Q.push(1);
viz[1].flip();
while(!Q.empty())
{
nod = Q.front();
Q.pop();
for(it = V[nod].begin() ; it != V[nod].end() ; it++)
if(!viz[*it] && c[nod][*it] > f[nod][*it])
{
Q.push(*it);
tata[*it] = nod;
if(*it == N)
return 1;
}
}
return 0;
}
void rezolva()
{
while(bfs())
{
int minim = INF;
for(int nod = N ; nod > 1 ; nod = tata[nod])
minim = min(minim, c[tata[nod]][nod] - f[tata[nod]][nod]);
flux += minim;
for(int nod = N ; nod > 1 ; nod = tata[nod])
f[tata[nod]][nod] += minim;
}
}
int main()
{
freopen("maxflow.in","r",stdin);
freopen("maxflow.out","w",stdout);
citeste();
rezolva();
printf("%d\n",flux);
return 0;
}