Pagini recente » Cod sursa (job #855248) | Cod sursa (job #1924495) | Cod sursa (job #2962852) | Cod sursa (job #945792) | Cod sursa (job #1716667)
#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],sursa,dest;
int bfs()
{
int i;
for(i=sursa;i<=dest;i++)
vaz[i]=0;
q.push(sursa);
vaz[sursa]=1;
while(!q.empty())
{
int nod=q.front();
q.pop();
int n=v[nod].size();
for(i=0;i<n;++i)
{
if(!vaz[v[nod][i]]&&cap[nod][v[nod][i]]>flow[nod][v[nod][i]])
{
vaz[v[nod][i]]=1;
tata[v[nod][i]]=nod;
if(v[nod][i]!=dest) q.push(v[nod][i]);
}
}
}
return vaz[dest];
}
int main()
{
int n,m;
si>>n>>m;
int i,a,b,c,sol=0;
for(i=0;i<m;++i)
{
si>>a>>b>>c;
v[a].push_back(b);
v[b].push_back(a);
cap[a][b]=c;
}
sursa=1;
dest=n;
while(bfs())
{
vector<int>::iterator it;
int s;
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(int i=dest;i!=sursa;i=tata[i])
s=min(s,cap[tata[i]][i]-flow[tata[i]][i]);
for(int i=dest;i!=sursa;i=tata[i])
{
flow[tata[i]][i]+=s;
flow[i][tata[i]]-=s;
}
sol+=s;
}
}
so<<sol<<'\n';
return 0;
}