Pagini recente » Cod sursa (job #2644120) | Cod sursa (job #967214) | Cod sursa (job #490086) | Cod sursa (job #2673378) | Cod sursa (job #1724260)
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>
#include <bitset>
using namespace std;
ifstream si("maxflow.in");
ofstream so("maxflow.out");
const int inf=1000000000;
vector<int> v[1010];
queue<int> q;
bitset<1010>vaz;
int cap[1010][1010],flow[1010][1010],tata[1010],dest;
int bfs()
{
int i;
for(i=2;i<=dest;i++)
vaz[i]=0;
q.push(1);
vaz[1]=1;
int nod;
vector<int>::iterator it;
while(!q.empty())
{
nod=q.front();
q.pop();
for(it=v[nod].begin();it!=v[nod].end();it++)
{
if(!vaz[*it]&&cap[nod][*it]>flow[nod][*it])
{
vaz[*it]=1;
tata[*it]=nod;
if(*it!=dest)
q.push(*it);
}
}
}
//cout<<vaz[dest];
return vaz[dest];
}
int main()
{
int n,m;
si>>n>>m;
dest=n;
int i;
int a,b;
for(i=0;i<m;++i)
{
si>>a>>b;
si>>cap[a][b];
v[a].push_back(b);
v[b].push_back(a);
}
int s,sol=0;
while(bfs())
{
vector<int>::iterator it;
for(it=v[dest].begin();it!=v[dest].end();it++)
if(vaz[*it]&&cap[*it][dest]>flow[*it][dest])
{
tata[dest]=*it;
s=inf;
for(i=dest;i!=1;i=tata[i])
s=min(s,cap[tata[i]][i]-flow[tata[i]][i]);
for(i=dest;i!=1;i=tata[i])
{
flow[tata[i]][i]+=s;
flow[i][tata[i]]-=s;
}
sol+=s;
}
//cout<<1;
}
so<<sol<<'\n';
so.close();
return 0;
}