Pagini recente » Cod sursa (job #2846772) | Cod sursa (job #1781359) | Cod sursa (job #2300615) | Cod sursa (job #1572725) | Cod sursa (job #583807)
Cod sursa(job #583807)
#include <stdio.h>
#include <string.h>
#include <vector>
#include <queue>
#define NMax 1010
#define INF 0x3f3f3f3f
using namespace std;
const char IN[]="maxflow.in",OUT[]="maxflow.out";
int N,M,Rez;
int C[NMax][NMax];
int F[NMax][NMax];
int p[NMax];
bool visit[NMax];
vector<int> ad[NMax];
int min(int a,int b){
return a<b ? a : b;
}
int bfs()
{
int x;
queue<int> qu;
memset(visit,0,sizeof(visit));
memset(p,0,sizeof(p));
qu.push(0);
p[0]=-1;
visit[0]=true;
while (!qu.empty())
{
x=qu.front();
qu.pop();
for (vector<int>::iterator it=ad[x].begin();it<ad[x].end();++it)
if (!visit[*it] && F[x][*it]!=C[x][*it])
{
visit[*it]=true;
p[*it]=x;
qu.push(*it);
}
}
return visit[N-1];
}
int main()
{
int i,x,y,c,v,m;
freopen(IN,"r",stdin);
scanf("%d%d",&N,&M);
for (i=0;i<M;++i)
{
scanf("%d%d%d",&x,&y,&c);
ad[x-1].push_back(y-1);
ad[y-1].push_back(x-1);
C[x-1][y-1]=c;
}
while (bfs())
for (vector<int>::iterator it=ad[N-1].begin();it<ad[N-1].end();++it) if (visit[*it] && F[*it][N-1] !=C[*it][N-1])
{
v=*it;
m=C[*it][N-1]-F[*it][N-1];
for (;v!=0;v=p[v])
m= min(m,C[p[v]][v]-F[p[v]][v]);
if (m==0) continue;
F[*it][N-1]+=m;
F[N-1][*it]-=m;
for (v=*it;v!=0;v=p[v])
F[p[v]][v]+=m,
F[v][p[v]]-=m;
Rez+=m;
}
freopen(OUT,"w",stdout);
printf("%d\n",Rez);
fclose(stdout);
return 0;
}