Pagini recente » Cod sursa (job #2202394) | Cod sursa (job #447280) | Cod sursa (job #170355) | Cod sursa (job #2060150) | Cod sursa (job #1070501)
#include <stdio.h>
#include <vector>
#include <queue>
using namespace std;
//#include <fstream>
vector<vector<unsigned> >graf;
vector<int>node,from;
queue <unsigned>q;
unsigned n,m,cap[1001][1001],start,sink;
void read()
{
unsigned u,c,v,i,j;
//scanf("%u %u %u %u",&n,&m,&start,&sink);
scanf("%u %u",&n,&m);
start = 1;sink = n;
graf.resize(n+1);
for(i=1;i<=n;i++)graf[i].push_back(0);
for(i=1;i<=m;i++)
{
scanf("%u %u %u",&u,&v,&c);
graf[u][0]++;
graf[u].push_back(v);
cap[u][v]=c;
}
node.resize(n+1);
from.resize(n+1);
node[start]=-1;
from[start]=-1;
}
unsigned resolve()
{
unsigned where,ok=1,i,j;
while(!q.empty() && ok)
{
where=q.front();
q.pop();
for(i=1;i<=graf[where][0];i++)
if(node[graf[where][i]]==0 && cap[where][graf[where][i]]>0)
{
q.push(graf[where][i]);
node[graf[where][i]]=1;
from[graf[where][i]]=where;
if(graf[where][i]==sink)
ok=0;
}
}
where=sink;
unsigned path_cap = 1<<30,prev;
while(from[where] > 0)
{
prev = from[where]; // the previous vertex
path_cap = min(path_cap, cap[prev][where]);
where = prev;
}
where = sink;
while (from[where] > 0)
{
prev = from[where];
cap[prev][where] -= path_cap;
cap[where][prev] += path_cap;
where = prev;
}
// if no path is found, path_cap is infinity
if (path_cap == 1<<30)
return 0;
else return path_cap;
}
unsigned max_flow()
{
while(!q.empty())q.pop();//un an mai tz: nu era mai simplu un clear() ? :|
q.push(start);
for(unsigned i=1;i<=n;i++)
{
node[i]=0;
from[i]=0;
}
node[start]=from[start]=-1;
unsigned result=resolve();
if(result>0)return max_flow()+result;
return 0;
}
int main()
{
freopen("maxflow.in","r",stdin);
freopen("maxflow.out","w",stdout);
//ofstream g("maxflow.out");
read();
//g<<max_flow();
printf("%u",max_flow());
return 0;
}