Pagini recente » Cod sursa (job #1546046) | Rating Elisabeta Oprina (Ellie59) | Cod sursa (job #907921) | Istoria paginii runda/matrice/clasament | Cod sursa (job #2586472)
#include<bits/stdc++.h>
using namespace std;
class Dinic{
private:
int S,D;
int N;
struct Edge{
int x;
int flow;
int cap;
int rv;
};
vector<vector<Edge>> gr;
vector<int> lvl;
vector<int> ind;
bool BFS_level(){
queue<int> q;
for(int i=1;i<=N;i++)
lvl[i]=-1;
q.push(S);
lvl[S]=0;
while(!q.empty()){
int node=q.front();
q.pop();
for(auto vec:gr[node]){
if(lvl[vec.x]==-1 && vec.flow<vec.cap){
lvl[vec.x]=lvl[node]+1;
q.push(vec.x);
}
}
}
if(lvl[D]!=-1)
return true;
return false;
}
int DFS_sendflow(int node,int curflow){
if(node==D || curflow==0)
return curflow;
for(;ind[node]<(int)gr[node].size();ind[node]++){
auto &vec=gr[node][ind[node]];
if(lvl[vec.x]==lvl[node]+1 && vec.flow<vec.cap){
curflow=DFS_sendflow(vec.x,min(curflow,vec.cap-vec.flow));
if(curflow>0){
vec.flow+=curflow;
gr[vec.x][vec.rv].flow-=curflow;
return curflow;
}
}
}
return 0;
}
public:
Dinic (int sz,int source,int dest){
gr.resize(sz+1);
S=source;
D=dest;
N=sz;
lvl.resize(N+1);
ind.resize(N+1);
}
void AddEdge(int x,int y,int cap){
gr[x].push_back({y,0,cap,(int)gr[y].size()});
gr[y].push_back({x,0,0,(int)gr[x].size()-1});
}
int getflow(){
int ans=0;
while(BFS_level()){
for(int i=0;i<=N;i++)
ind[i]=0;
int flow;
while((flow=DFS_sendflow(S,INT_MAX))>0)
ans+=flow;
}
return ans;
}
};
int main()
{
FILE*fin,*fout;
fin=fopen("maxflow.in","r");
fout=fopen("maxflow.out","w");
int n,m;
fscanf(fin,"%d%d",&n,&m);
Dinic network(n,1,n);
for(int i=1;i<=m;i++){
int x,y,z;
fscanf(fin,"%d%d%d",&x,&y,&z);
network.AddEdge(x,y,z);
}
fprintf(fout,"%d",network.getflow());
return 0;
}