Pagini recente » Cod sursa (job #1021739) | Cod sursa (job #623030) | Cod sursa (job #705228) | Cod sursa (job #1039859) | Cod sursa (job #1942036)
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <vector>
#include <queue>
#define N 1001
#define inf 0x7fffffff
using namespace std;
vector <int> G[N];
vector <int>::iterator it;
int c[N][N],f[N][N],t[N],flow=0,s,d,n;
void Read(){
int x,y,m;
freopen("maxflow.in","r",stdin);
scanf("%d%d",&n,&m);
while (m--)
{
scanf("%d%d",&x,&y);
scanf("%d",&c[x][y]);
G[x].push_back(y);
G[y].push_back(x);
}
}
inline int bfs(){
int ok=0,node;
queue <int> Q;
memset(t,0,sizeof(t));
t[s]=-1;Q.push(s);
while (!Q.empty())
{
node=Q.front();Q.pop();
for (it=G[node].begin();it!=G[node].end();++it)
if (t[*it]==0 && c[node][*it]>f[node][*it])
if(*it!=d) {
t[*it]=node;
Q.push(*it);
}
else ok=1;
}
return ok;
}
void Dinic(){
int mini,node;
s=1;d=n;
for (int drum=bfs();drum;drum=bfs())
for (it=G[d].begin();it!=G[d].end();++it)
if (t[*it] && c[*it][d]>f[*it][d])
{
t[d]=*it;
mini=inf;
for (node=d;node!=s;node=t[node])
mini=min(mini,c[t[node]][node]-f[t[node]][node]);
if(mini<=0) continue;
flow+=mini;
for (node=d;node!=s;node=t[node])
{
f[t[node]][node]+=mini;
f[node][t[node]]-=mini;
}
}
}
void Write(){
freopen("maxflow.out","w",stdout);
printf("%d",flow);
}
int main()
{
Read();
Dinic();
Write();
return 0;
}