Pagini recente » Cod sursa (job #1687210) | Cod sursa (job #1508809) | Cod sursa (job #1055344) | Cod sursa (job #1813863) | Cod sursa (job #303874)
Cod sursa(job #303874)
#include <fstream>
#include <vector>
using namespace std;
#define InFile "maxflow.in"
#define OutFile "maxflow.out"
#define MAXN 1001
#define INF 0x3f3f3f3f
int c[MAXN][MAXN],f[MAXN][MAXN],sol=0,n,m,viz[MAXN],coada[MAXN],t[MAXN];
vector<int>g[MAXN];
void citire()
{int i,x,y,z;
ifstream in(InFile);
in>>n>>m;
for(i=1;i<=m;i++)
{
in>>x>>y>>z;
c[x][y]=z;
g[x].push_back(y);
g[y].push_back(x);
}
in.close();
}
int bfs()
{int i,u,j,nod,x;
for(i=1;i<=n;i++)viz[i]=0;
coada[1]=1;
u=1;
for(i=1;i<=u;i++)
{
nod=coada[i];
if(nod==n)continue;
for(j=0;j<g[nod].size();j++)
{
x=g[nod][j];
if(f[nod][x]==c[nod][x]||viz[x])continue;
viz[x]=1;
coada[++u]=x;
t[x]=nod;
}
}
return viz[n];
}
int minim(int a,int b)
{return a<b?a:b;}
int main()
{int i,nod,j,x,min;
citire();
while(bfs())
for(i=0;i<g[n].size();i++)
{
nod=g[n][i];
if(!viz[nod]||f[nod][n]==c[nod][n])continue;
t[n]=nod;
min=INF;
for(nod=n;nod!=1;nod=t[nod])
min=minim(min,c[t[nod]][nod]-f[t[nod]][nod]);
if(!min)continue;
sol+=min;
for(nod=n;nod!=1;nod=t[nod])
{
f[t[nod]][nod]+=min;
f[nod][t[nod]]-=min;
}
}
ofstream out(OutFile);
out<<sol<<'\n';
out.close();
return 0;
}