Pagini recente » Monitorul de evaluare | Monitorul de evaluare | Cod sursa (job #1438046) | Istoria paginii tema | Cod sursa (job #2238145)
#include <iostream>
#include <fstream>
#include <queue>
#define NRNOD 1005
#define INF 2000000000;
using namespace std;
queue<int> q;
ifstream fin ("maxflow.in");
ofstream fout ("maxflow.out");
struct graf
{
int source,target,cap,cur;
graf *next,*rev;
}*a[NRNOD],*prec[NRNOD];
int main()
{
int n,m,maxFlow=0;
fin>>n>>m;
for (int i=0; i<m; i++)
{
int x,y,c;
fin>>x>>y>>c;
graf *nou=new graf;
nou->source=x;
nou->target=y;
nou->cap=c;
nou->cur=0;
nou->next=a[x];
graf *inv=new graf;
inv->source=y;
inv->target=x;
inv->cap=0;
inv->cur=0;
inv->next=a[y];
inv->rev=nou;
a[y]=inv;
nou->rev=inv;
a[x]=nou;
}
do
{
for (int i=1; i<=n; i++)
prec[i]=NULL;
q.push(1);
while (!q.empty())
{
int nod=q.front();
q.pop();
for (graf* j=a[nod]; j!=NULL; j=j->next)
if(prec[j->target]==NULL&&j->target!=1&&j->cap>j->cur)
{
prec[j->target]=j;
q.push(j->target);
}
}
if(prec[n]!=NULL)
for (graf* j=a[n]; j!=NULL; j=j->next)
{
if (j->rev->cur >= j->rev->cap|| prec[j->rev->target]==NULL) continue;
prec[n]=j->rev;
int deltaFlow=INF;
for (graf* edge=prec[n]; edge!=NULL; edge=prec[edge->source])
deltaFlow=min(deltaFlow,edge->cap-edge->cur);
for (graf* edge=prec[n]; edge!=NULL; edge=prec[edge->source])
{
edge->cur+=deltaFlow;
edge->rev->cur-=deltaFlow;
}
maxFlow+=deltaFlow;
}
}
while(prec[n]!=NULL);
fout<<maxFlow;
/*for (int i=1;i<=n;i++)
for (graf *j=a[i];j!=NULL;j=j->next)
cout<<(char)(j->source+'A'-1)<<"->"<<(char)(j->target+'A'-1)<<": "<<j->cur<<'/'<<j->cap<<endl;*/
return 0;
}