Pagini recente » Cod sursa (job #1788257) | Cod sursa (job #9411) | Cod sursa (job #2060577) | Cod sursa (job #252386) | Cod sursa (job #2048470)
#include <iostream>
#include <fstream>
#include <queue>
#include <vector>
#include <cstring>
using namespace std;
ifstream f("maxflow.in");
ofstream g("maxflow.out");
const int minn=(1<<30);
vector <int> drum[1001];
int capac[1001][1001];
int vizit[1001],ant[1001],n,m,c[1001];
int sol;
queue <int> q;
void BFS (int node)
{
int i;
q.push(node);
memset(vizit,0,sizeof(vizit));
memset(ant,0,sizeof(ant));
vizit[node]=1;
while (!q.empty())
{
node=q.front();
if (node==n)
{
while (!q.empty()) q.pop();
return;
}
q.pop();
for (i=0;i<drum[node].size();i++)
{
if (vizit[drum[node][i]]==0 && capac[node][drum[node][i]]>0)
{
q.push(drum[node][i]);
vizit[drum[node][i]]=1;
ant[drum[node][i]]=node;
}
}
}
}
int main()
{
int x,y,z,i,mi;
f>>n>>m;
for (i=1;i<=m;i++)
{
f>>x>>y>>z;
drum[x].push_back(y);
drum[y].push_back(x);
capac[x][y]=z;
}
int aux;
int estedrum=1;
while (estedrum==1)
{
BFS(1);
if (vizit[n]==0) break;
else
{
for (i=0;i<drum[n].size();i++) if (vizit[drum[n][i]]==1)
{
x=drum[n][i];
mi=minn;
mi=min(capac[drum[n][i]][n],mi);
while (ant[x]!=0)
{
mi=min(mi,capac[ant[x]][x]);
x=ant[x];
}
sol+=mi;
x=drum[n][i];
while (ant[x]!=0)
{
capac[ant[x]][x]-=mi;
capac[x][ant[x]]+=mi;
x=ant[x];
}
capac[drum[n][i]][n]-=mi;
capac[n][drum[n][i]]+=mi;
}
}
}
g<<sol;
return 0;
}