Pagini recente » Cod sursa (job #1651696) | Arhiva de probleme | Istoria paginii runda/summer_camp_3 | Cod sursa (job #219326) | Cod sursa (job #984590)
Cod sursa(job #984590)
#include <cstdio>
#include <vector>
#include <queue>
#include <cstring>
#define pb push_back
#define NODES 1001
#define inf 1<<30
using namespace std;
int n, m, flow, capacity[NODES][NODES], f[NODES][NODES], p[NODES];
bool visited[NODES];
vector <int> adj[NODES];
queue <int> q;
inline void read()
{
freopen("maxflow.in", "r", stdin);
scanf("%d %d", &n, &m);
int x, y, z;
for(int i=1;i<=m;++i)
{
scanf("%d %d %d", &x, &y, &z);
adj[x].pb(y);
adj[y].pb(x);
capacity[x][y]=z;
}
}
inline void write()
{
freopen("maxflow.out", "w", stdout);
printf("%d\n", flow);
}
bool BFS()
{
memset(visited, 0, sizeof(visited));
q.push(1); visited[1]=1;
while(!q.empty())
{
int node=q.front(); q.pop();
if(node==n)
continue;
for(vector <int> :: iterator it=adj[node].begin();it!=adj[node].end();++it)
if(!visited[*it] && f[node][*it] != capacity[node][*it])
{
p[*it]=node;
q.push(*it);
visited[*it]=1;
}
}
return visited[n];
}
inline void solve()
{
int min_flow=0, node;
while(BFS())
for(vector <int> :: iterator it=adj[n].begin();it!=adj[n].end();++it)
{
p[n]=*it;
min_flow=inf;
for(int i=n;i!=1;i=p[i])
min_flow=min(min_flow, capacity[p[i]][i]-f[p[i]][i]);
for(int i=n;i!=1;i=p[i])
{
f[p[i]][i]+=min_flow;
f[i][p[i]]-=min_flow;
}
flow+=min_flow;
}
}
int main()
{
read();
solve();
write();
return 0;
}