Pagini recente » Cod sursa (job #1448358) | Cod sursa (job #2423015) | Cod sursa (job #1323412) | Cod sursa (job #2833109) | Cod sursa (job #2700461)
#include <fstream>
#include <vector>
#include <queue>
using namespace std;
ifstream in("maxflow.in");
ofstream out("maxflow.out");
struct road{
int nod,cur_flow;
};
const int N=1001;
const int M=5001;
const int INF=110000;
int c[N][N];
vector<int> g[N];
int bfs(int source, int sink, int nr_nod, vector<int> &parent)
{
bool viz[nr_nod+1];
for(int i=1; i<=nr_nod; i++)
{
viz[i]=0;
}
queue<road> q;
q.push({source, INF});
viz[source]=1;
while(!q.empty())
{
int cur=q.front().nod, flow=q.front().cur_flow;
q.pop();
for(int urm : g[cur])
{
if(viz[urm]==0 && c[cur][urm])
{
parent[urm]=cur;
viz[urm]=1;
flow=min(flow, c[cur][urm]);
if(urm==sink)
{
return flow;
}
q.push({urm, flow});
}
}
}
return 0;
}
int maxflow(int nr_nod, int source, int sink)
{
int flow=0,new_flow;
vector<int> parent;
parent.push_back(source);
while(new_flow=bfs(source, sink, nr_nod, parent))
{
flow+=new_flow;
int cur=sink;
while(cur!=source)
{
int ant=parent[cur];
c[ant][cur]-=new_flow;
c[cur][ant]+=new_flow;
cur=ant;
}
}
return flow;
}
int main()
{
int n,m,x,y,z;
in>>n>>m;
for(int i=1; i<=m; i++)
{
in>>x>>y>>z;
g[x].push_back(y);
c[x][y]=z;
}
out<<maxflow(n, 1, n);
return 0;
}