Pagini recente » Cod sursa (job #1073245) | Cod sursa (job #963166) | Cod sursa (job #1318671) | Cod sursa (job #1141888) | Cod sursa (job #914464)
Cod sursa(job #914464)
#include <stdio.h>
#include <string.h>
#include <vector>
#include <queue>
#define NMax 10010
using namespace std;
const char IN[]="maxflow.in",OUT[]="maxflow.out";
int N,M;
int C[NMax][NMax],F[NMax][NMax],P[NMax];
bool b[NMax];
vector<int> ad[NMax];
queue<int> qu;
bool bfs()
{
int x,i;
while (!qu.empty()) qu.pop();
qu.push(1);
memset(b,0,sizeof(b));
memset(P,0,sizeof(P));
b[1]=true;
while (!qu.empty())
{
x=qu.front();qu.pop();b[x]=true;
if (x==N) continue;
for (i=0;i<(int)ad[x].size();++i) if (!b[ad[x][i]] && C[x][ad[x][i]]>F[x][ad[x][i]])
{
b[ad[x][i]]=true;
qu.push(ad[x][i]);
P[ad[x][i]]=x;
}
}
return b[N];
}
int flow()
{
int ret=0,i,p,f;
while (bfs())
{
for (i=0;i<(int)ad[N].size();++i) if (C[ad[N][i]][N]!=F[ad[N][i]][N] && b[ad[N][i]])
{
P[N]=ad[N][i];
f=C[P[N]][N]-F[P[N]][N];
for (p=N;p!=1 && f;p=P[p])
f=min(f,C[P[p]][p]-F[P[p]][p]);
if (!f) continue;
ret+=f;
for (p=N;p!=1;p=P[p])
F[p][P[p]]-=f,
F[P[p]][p]+=f;
}
}
return ret;
}
int main()
{
int i,x,y,c;
freopen(IN,"r",stdin);
scanf("%d%d",&N,&M);
for (i=1;i<=M;++i)
{
scanf("%d%d%d",&x,&y,&c);
ad[x].push_back(y);
ad[y].push_back(x);
C[x][y]+=c;
}
fclose(stdin);
freopen(OUT,"w",stdout);
printf("%d\n",flow());
fclose(stdout);
return 0;
}