Pagini recente » Cod sursa (job #1941023) | Cod sursa (job #1892705) | Cod sursa (job #2905553) | Cod sursa (job #1851405) | Cod sursa (job #2373801)
#include <bits/stdc++.h>
#define Dim 1004
using namespace std;
ifstream f("maxflow.in");
ofstream g("maxflow.out");
int N,M,C[Dim][Dim],flow,a,b,c;
int T[Dim];
bool viz[Dim];
vector <int> V[Dim];
void init()
{
for(int i=1;i<=N;i++)
{
viz[i]=0;
T[i]=0;
}
}
bool BFS()
{
queue <int> qu;
qu.push(1);
viz[1]=1;
T[1]=1;
while(!qu.empty()&&viz[N]==0)
{
int nod=qu.front();
qu.pop();
viz[nod]=1;
for(unsigned int i=0;i<V[nod].size()&&viz[N]==0;i++)
{
int vecin=V[nod][i];
int cap=C[nod][vecin];
if(!viz[vecin]&&cap>0)
{
T[vecin]=nod;
viz[vecin]=1;
qu.push(vecin);
}
}
}
return viz[N];
}
int main()
{
f>>N>>M;
for(int i=1;i<=M;i++)
{
f>>a>>b>>c;
C[a][b]=c;
//C[b][a]=(-1)*c;
V[a].push_back(b);
V[b].push_back(a);
}
while(BFS())
{
for(unsigned int i=0;i<V[N].size();i++)
{
int vecin=V[N][i];
if(viz[vecin]==1&&C[vecin][N]>=0)
{
int minim=INT_MAX;
T[N]=vecin;
int poz=N;
while(poz!=1)
{
minim=min(minim,C[T[poz]][poz]);
poz=T[poz];
}
poz=N;
flow+=minim;
while(poz!=1)
{
C[T[poz]][poz]-=minim;
C[poz][T[poz]]+=minim;
poz=T[poz];
}
}
}
init();
}
g<<flow;
return 0;
}