Pagini recente » Cod sursa (job #907590) | Cod sursa (job #896823) | Cod sursa (job #2446166) | Cod sursa (job #3319969) | Cod sursa (job #3328595)
#include <fstream>
#include <vector>
#include <queue>
#include <algorithm>
/// Edmonds-Karp
using namespace std;
ifstream f("maxflow.in");
ofstream g("maxflow.out");
const int NMAX = 1e3;
int capacitate[NMAX+1][NMAX+1];
int flux[NMAX+1][NMAX+1];
vector<int> G[NMAX+1];
int vis[NMAX+1],p[NMAX+1];
int n,m;
int bfs(int s,int d)
{
for(int i=1;i<=n;i++)
{
vis[i]=0;
p[i]=0;
}
queue<int> q;
q.push(s);
vis[s]=1;
while(!q.empty())
{
int nod=q.front();
q.pop();
for(auto vecin:G[nod])
{
if(!vis[vecin] && capacitate[nod][vecin] - flux[nod][vecin]>0)
{
vis[vecin]=1;
p[vecin]=nod;
q.push(vecin);
}
}
}
if(!vis[d])
{
return 0;
}
vector<int>path;
int x=d;
while(x!=0)
{
path.push_back(x);
x=p[x];
}
reverse(path.begin(),path.end());
int flow = 1e9;
for(int i=0;i<path.size()-1;i++)
{
int a=path[i];
int b=path[i+1];
flow=min(flow,capacitate[a][b]-flux[a][b]);
}
for(int i=0;i<path.size()-1;i++)
{
int a=path[i];
int b=path[i+1];
flux[a][b]+=flow;
flux[b][a]-=flow;
}
return flow;
}
int main()
{
f>>n>>m;
for(int i=1;i<=m;i++)
{
int x,y,c;
f>>x>>y>>c;
capacitate[x][y]=c;
G[x].push_back(y);
G[y].push_back(x);
}
int maxflow=0;
while(true)
{
int flow=bfs(1,n);
if(flow==0)
break;
maxflow+=flow;
}
g<<maxflow;
return 0;
}