Pagini recente » Cod sursa (job #841566) | Cod sursa (job #2916914) | Cod sursa (job #1467570) | Cod sursa (job #302334) | Cod sursa (job #784595)
Cod sursa(job #784595)
#include <stdio.h>
#include <string.h>
#include <queue>
using namespace std;
#define dim 1005
#define inf 1<<30
#define pb push_back
int a[dim][dim],n,m;
vector <int> aa[dim];
int source,sink;
bool viz[dim];
int par[dim];
bool cit()
{
int t1,t2,x;
scanf("%d %d",&n,&m);
for (int i=0;i<m;i++)
{
scanf("%d %d %d",&t1,&t2,&x);
a[t1][t2]=x;
aa[t1].pb(t2);
aa[t2].pb(t1);
}
}
bool bf()
{
queue <int> q;
memset(viz,false,sizeof(viz));
memset(par,0,sizeof(par));
q.push(source);
viz[source]=true;
while (!q.empty())
{
int nod = q.front();
q.pop();
if (nod != sink)//skip the sink node because he is source
for (int i=0;i<aa[nod].size();i++)
{
int vec = aa[nod][i];
if ((a[nod][vec]>0)&&(!viz[vec]))//road and not visited
{
q.push(vec);
viz[vec]=true;
par[vec]=nod;
}
}
}
return viz[sink];
}
int minflow() //min flow on path func
{
int fmin = inf;
for (int nod=sink;nod!=source;nod=par[nod])
{
if(fmin > a[par[nod]][nod])
fmin = a[par[nod]][nod];
}
return fmin;
}
int main()
{
freopen("maxflow.in","r",stdin);
freopen("maxflow.out","w",stdout);
cit();
int flow = 0;
source = 1;
sink = n;
while (bf())
{
for (int i=0;i<aa[sink].size();i++)
{
int nod = aa[sink][i];
if((a[nod][sink]!=0)&&(viz[nod]))//if unique road to sink
{
par[sink]=nod; // augment the path
int fmin = minflow();
if (fmin>0)
{
for (nod=sink;nod!=source;nod=par[nod]) // update flux path;
{
a[par[nod]][nod]-=fmin;
a[nod][par[nod]]+=fmin;
}
flow += fmin; //update flux;
}
}
}
}
printf("%d\n",flow);
return 0;
}