Pagini recente » Cod sursa (job #2043616) | Cod sursa (job #2472888) | Cod sursa (job #2588327) | Cod sursa (job #522221) | Cod sursa (job #613493)
Cod sursa(job #613493)
#include<cstdio>
#include<vector>
#include<bitset>
#include<queue>
#define infile "maxflow.in"
#define outfile "maxflow.out"
#define n_max 1005
#define pb push_back
#define INF 1<<30
#define FOR(g, it) \
for(vector<int> :: iterator it = g.begin(); it!=g.end(); ++it)
using namespace std;
vector < int > v[n_max];//graful
int c[n_max][n_max], f[n_max][n_max]; // capacitatea si fluxul
int t[n_max];//t[i] = tatal lui i in parcurgerea bfs
bitset <n_max> uz; //uz[i]=1 daca i a fost folosit in bfs
int flux;//fluxul maxim total
int n;
void citeste()
{
freopen(infile,"r",stdin);
int m, x, y, cost;
scanf("%d %d",&n, &m);
while(m--)
{
scanf("%d %d %d",&x,&y,&cost);
v[x].pb(y);
v[y].pb(x);
c[x][y] = cost;
}
fclose(stdin);
}
int bfs()
{
queue < int > q;
uz.reset();
q.push(1);//adaug in coada primul nod
uz.set(1);;//il marchez ca utilizat
int nod;
vector < int > ::iterator it;
while(!q.empty())//am noduri in coada
{
nod = q.front();//elementul curent
q.pop();//scot elementul din coada
if(nod==n)
continue;
FOR(v[nod],it)
if(c[nod][*it] != f[nod][*it] && !uz[*it])//daca exista cost (exista arc) si nu am folosit acest nod pana acum
{
uz.set(*it);//il marchez ca utilizat
q.push(*it);//il adaug in coada
t[*it] = nod; //ii salvez tatal din bfs
}
}
return uz[n];
}
void rezolva()
{
int fmin = INF;
while(bfs())
FOR(v[n], it)
{
int nod = *it;
if(f[nod][n] == c[nod][n] || !uz[nod])
continue;
t[n] = nod;
fmin = INF;
for(nod = n; nod != 1; nod = t[nod])
fmin = min(fmin, c[t[nod]][nod] - f[t[nod]][nod]);
if(!fmin)
continue;
for(nod = n; nod!=1; nod = t[nod])
{
f[t[nod]][nod] +=fmin;
f[nod][t[nod]] -=fmin;
}
flux +=fmin;
}
}
void afiseaza()
{
freopen(outfile,"w",stdout);
printf("%d\n",flux);
fclose(stdout);
}
int main()
{
citeste();
rezolva();
afiseaza();
return 0;
}