Pagini recente » Cod sursa (job #2923689) | Cod sursa (job #1917479) | Cod sursa (job #1017198) | Cod sursa (job #1074197) | Cod sursa (job #1226726)
#include<cstdlib>
#include<fstream>
#include<vector>
#include<queue>
using namespace std;
ifstream fi("maxflow.in");
ofstream fo("maxflow.out");
const int max_n = 1003;
vector <int> a[max_n];
queue <int> q;
int Capacity[max_n][max_n],Flow[max_n][max_n],Max_Flow;
int i,n,m,x,y,c,start_node,end_node,P[max_n];
int augmenting_path(int start_node, int end_node){
int viz[max_n];
for(int i=1;i<=n;i++) viz[i]=0;
q.push(start_node);
viz[start_node]=1;
P[start_node]=start_node;
while(q.size())
{
int x=q.front();
for(int j=0;j<(int)a[x].size();j++)
{
int y=a[x][j];
if(!viz[y] && Capacity[x][y]>Flow[x][y])
{
q.push(y);
viz[y]=1;
P[y]=x;
if(y==end_node){
while(q.size()) q.pop();
return P[end_node];
}
}
}
q.pop();
}
return 0;
}
int main(){
fi>>n>>m;
for(i=1;i<=m;i++)
{
fi>>x>>y>>c;
a[x].push_back(y);
a[y].push_back(x);
Capacity[x][y]=c;
}
start_node=1;
end_node=n;
Max_Flow=0;
while(augmenting_path(start_node,end_node))
{
int path_capacity=Capacity[P[end_node]][end_node]-Flow[P[end_node]][end_node];
y=end_node;
while(y!=P[y])
{
if(path_capacity>Capacity[P[y]][y]-Flow[P[y]][y])
path_capacity=Capacity[P[y]][y]-Flow[P[y]][y];
y=P[y];
}
y=end_node;
while(y!=P[y])
{
Flow[P[y]][y]+=path_capacity;
Flow[y][P[y]]-=path_capacity;
y=P[y];
}
Max_Flow+=path_capacity;
}
fo<<Max_Flow;
fi.close();
fo.close();
return 0;
}