Pagini recente » Cod sursa (job #222769) | Cod sursa (job #1482340) | Cod sursa (job #2402790) | Cod sursa (job #1793418) | Cod sursa (job #3155468)
#include <iostream>
#include <fstream>
#include <vector>
#include<queue>
using namespace std;
struct Dinic
{
struct Edge
{
int from, to, cap, ult;
};
int n;
vector<int>dist; ///in dist tinem distanta minima de la orice nod la source
vector<int>last; ///pentru un nod tinem ultimul edge introdus
vector<Edge>edges; ///tinem toate edge-urile
queue<int>cueue; ///
Dinic (int cn)
{
n=cn;
last.assign(n+1, -1);
}
void introdus(int from, int to, int cap)
{
edges.push_back({from, to, cap, last[from]});
///cout<<last[from]<<" ";
last[from]=edges.size()-1;
edges.push_back({to, from, 0, last[to]});
///cout<<last[to]<<" ";
last[to]=edges.size()-1;
}
bool bfs(int source, int sink) ///verificam daca mai e vreun drum si construim distantele
{
dist.assign(n+1, 1e9);
cueue.push(source); ///in cueue tin toate nodurile de vizitat
dist[source]=0;
while (!cueue.empty())
{
int poz=cueue.front();
cueue.pop();
for (int i=last[poz]; i!=-1; i=edges[i].ult)
{
if (dist[edges[i].to]==1e9&&edges[i].cap>0)
{
dist[edges[i].to]=1+dist[poz];
cueue.push(edges[i].to);
}
}
}
return (dist[sink]!=1e9);
}
int dfs(int source, int sink, int flow)
{
if (source==sink)
return flow;
int ans=0;
for (int i=last[source]; i!=-1; i=edges[i].ult)
{
///cout<<"TURIP";
if (edges[i].cap>0&&dist[edges[i].to]== (1+dist[edges[i].from]))
{
int sent=dfs(edges[i].to, sink, min(flow, edges[i].cap));
ans+=sent;
flow-=sent;
edges[i].cap-=sent;
edges[i^1].cap+=sent;
}
}
return ans;
}
int MaximumFlow(int source, int sink)
{
long long int ans=0;
while (bfs(source, sink))
{
ans+=dfs(source, sink, 1e9);
}
return ans;
}
};
int main()
{
ifstream cin ("maxflow.in");
ofstream cout ("maxflow.out");
int n, e, a, b, capacitate;
cin>>n>>e;
Dinic d(n);
for (int i=0; i<e; i++)
{
cin>>a>>b>>capacitate;
d.introdus(a, b, capacitate);
}
cout<<d.MaximumFlow(1, n);
}