Pagini recente » Cod sursa (job #2249833) | Cod sursa (job #94825) | Cod sursa (job #2240720) | Cod sursa (job #1874378) | Cod sursa (job #1386754)
#include <cstdio>
#include <queue>
#include <vector>
#define NMAX 1001
#define INF 1<<30
using namespace std;
FILE* fin=fopen("maxflow.in","r");
FILE* fout=fopen("maxflow.out","w");
int n,m,mark[NMAX];
int cap[NMAX][NMAX],flux[NMAX][NMAX],s,f,fmax;
vector <int> G[NMAX];
void citire();
void rezolvare();
int minim(int a,int b) { if (a<b) return a; return b;}
bool marcheaza();
int main()
{
citire();
s=1; f=n;
rezolvare();
return 0;
}
void citire()
{
int i,x,y,z;
fscanf(fin,"%d %d",&n,&m);
for (i=1; i<=m; i++)
{
fscanf(fin,"%d %d %d",&x,&y,&z);
cap[x][y]=z;
G[x].push_back(y);
G[y].push_back(x);
}
}
void rezolvare()
{
int nod,v;
for (fmax=0; marcheaza(); fmax+=v)
{
v=INF;
for (nod = f; nod != s; nod = mark[nod])
v = minim(v, cap[mark[nod]][nod] - flux[mark[nod]][nod]);
for (nod = f; nod != s; nod = mark[nod])
{
flux[mark[nod]][nod] += v;
flux[nod][mark[nod]] -= v;
}
}
fprintf(fout,"%d\n",fmax);
}
bool marcheaza()
{
int i,nod;
queue <int> q;
for (i=1; i<=n; i++) mark[i]=0;
mark[s]=INF;
q.push(s);
while (!q.empty())
{
nod=q.front(); q.pop();
for (i=0; i<G[nod].size(); i++)
{
if (cap[nod][G[nod][i]]== flux[nod][G[nod][i]] || mark[G[nod][i]]) continue;
mark[G[nod][i]]=nod;
q.push(G[nod][i]);
if (G[nod][i]==f) return 1;
}
}
return 0;
}