Pagini recente » Cod sursa (job #644666) | Cod sursa (job #644638) | Cod sursa (job #3336676) | Cod sursa (job #3320561) | Cod sursa (job #3336674)
#include <fstream>
#include <queue>
#include <vector>
#include <iostream>
using namespace std;
struct muc
{
int cap, flow, dest;
};
ifstream in("maxflow.in");
ofstream out("maxflow.out");
int n, m;
vector<int> v[1005];
muc edge[10005];
int dist[1005];
int viz[1005];
int prost[1005];
int INF = (1 << 30);
//1 e sursa, n e destinatie
int bfs(int start)
{
for(int i = 1; i<=n; i++)
{
dist[i] = INF;
}
queue<int> q;
q.push(start);
dist[start] = 0;
while(!q.empty())
{
int nod = q.front();
q.pop();
for(auto it: v[nod])
{
if(edge[it].cap - edge[it].flow >= 1 && dist[edge[it].dest] == INF)
{
dist[edge[it].dest] = dist[nod] + 1;
q.push(edge[it].dest);
}
}
}
return dist[n] != INF;
}
int dfs(int nod, int flow)
{
viz[nod] = 1;
if(nod == n)
{
return flow;
}
for(auto it: v[nod])
{
if(dist[edge[it].dest] == dist[nod] + 1 && edge[it].cap - edge[it].flow >= 1 && viz[edge[it].dest] == 0 && prost[edge[it].dest] == 0)
{
int newflow = dfs(edge[it].dest, min(flow, edge[it].cap - edge[it].flow));
if(newflow >= 1)
{
edge[it].flow += newflow;
edge[it ^ 1].flow -= newflow;
return newflow;
}
else
{
prost[edge[it].dest] = 1;
}
}
}
return 0;
}
int main()
{
in>>n>>m;
int x, y, z;
for(int i = 0; i<m; i++)
{
in>>x>>y>>z;
edge[2 * i] = {z, 0, y};
edge[2 * i + 1] = {0, 0, x};
//bag indicele muchiei
v[x].push_back(2*i);
v[y].push_back(2*i + 1);
}
int ans = 0;
while(bfs(1))
{
for(int i = 1; i<=n; i++)
{
prost[i] = 0;
}
while(1)
{
for(int i = 1; i<=n; i++)
{
viz[i] = 0;
}
int newflow = dfs(1, INF);
if(newflow == 0)
{
break;
}
ans += newflow;
}
}
out<<ans;
return 0;
}