Pagini recente » Cod sursa (job #1175698) | Cod sursa (job #2885263) | Cod sursa (job #2632768) | Monitorul de evaluare | Cod sursa (job #2187568)
#include <iostream>
#include <cstdio>
#include <vector>
#include <cstring>
#include <queue>
using namespace std;
int m,n,f,rasp,flux[1005][1005],capacitate[1005][1005],viz[1005],vTati[1005];
vector <int> G[1005];
queue <int> qbfs;
void citire()
{
scanf("%d%d",&n,&m);
int nod1,nod2,c;
for(int i=1; i<=m; i++)
{
scanf("%d%d%d",&nod1,&nod2,&c);
G[nod1].push_back(nod2);
G[nod2].push_back(nod1);
capacitate[nod1][nod2]=c;
}
}
int bfs()
{
memset(viz,0,sizeof(viz));
viz[1]=1;
qbfs.push(1);
int nod;
while(!qbfs.empty())
{
nod=qbfs.front();
qbfs.pop();
if(nod==n)
continue;
for(auto fiu:G[nod])
{
if(capacitate[nod][fiu]>flux[nod][fiu]&&!viz[fiu])
{
vTati[fiu]=nod;
viz[fiu]=1;
qbfs.push(fiu);
}
}
}
return viz[n];
}
int main()
{
freopen("maxflow.in","r",stdin);
freopen("maxflow.out","w",stdout);
citire();
while(bfs())
{
for(auto frunza:G[n])
{
if(viz[frunza]&&capacitate[frunza][n]>flux[frunza][n])
{
vTati[n]=frunza;
f=0x3f3f3f3f;
for(int nod=n; nod!=1; nod=vTati[nod])
{
f=min(f,capacitate[vTati[nod]][nod]-flux[vTati[nod]][nod]);
}
for(int nod=n; nod!=1; nod=vTati[nod])
{
flux[nod][vTati[nod]]-=f;
flux[vTati[nod]][nod]+=f;
}
rasp+=f;
}
}
}
printf("%d",rasp);
return 0;
}