Pagini recente » Cod sursa (job #1886803) | Cod sursa (job #373272) | Cod sursa (job #653959) | Cod sursa (job #1168622) | Cod sursa (job #1165277)
#include <cstdio>
#include <vector>
#include <queue>
#define INF 200000002
#define maxn 1005
using namespace std;
vector <int> G[maxn],viz(maxn,0),d(maxn,INF);
queue <int> Q;
FILE *f=fopen("maxflow.in","r");
FILE *g=fopen("maxflow.out","w");
int C[maxn][maxn],F[maxn][maxn],T[maxn];
int flow,fmin,x,y,c,m,n;
int bfs(){
for(int i=2;i<=n;i++)
viz[i]=0;
Q.push(1);
viz[1]=1;
//d[1]=0;
while(Q.empty()==0)
{
int nod=Q.front();
Q.pop();
if(nod==n)
continue;
for(int i=0;i<G[nod].size();i++)
{
if(viz[G[nod][i]] || C[nod][G[nod][i]]==F[nod][G[nod][i]])
continue;
viz[G[nod][i]]=1;
Q.push(G[nod][i]);
T[G[nod][i]]=nod;
}
}
return viz[n];
}
int main()
{
fscanf(f,"%d%d",&n,&m);
for(int i=1;i<=m;i++)
{
fscanf(f,"%d%d%d",&x,&y,&c);
G[x].push_back(y);
G[y].push_back(x);
C[x][y]=c;
}
flow=0;
for(;bfs();)
for(int i=0;i<G[n].size();i++)
{
if(!viz[G[n][i]] || C[G[n][i]][n]==F[G[n][i]][n])
continue;
T[n]=G[n][i];
fmin=INF;
for(int nod=n;nod!=1;nod=T[nod])
fmin=min(fmin,C[T[nod]][nod]-F[T[nod]][nod]);
if(fmin==0)
continue;
for(int nod=n;nod!=1;nod=T[nod])
{
F[T[nod]][nod]+=fmin;
F[nod][T[nod]]-=fmin;
}
flow+=fmin;
}
fprintf(g,"%d",flow);
return 0;
}