Pagini recente » Istoria paginii utilizator/kosas | Profil dia20 | Istoria paginii utilizator/the_secret | Diferente pentru autumn-warmup-2007/solutii/runda-3 intre reviziile 10 si 11 | Cod sursa (job #2816232)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("maxflow.in");
ofstream fout("maxflow.out");
int t[1005],n,m,i,f[1005][1005],c[1005][1005],u,v;
bool sel[1005];
vector<int> g[1005];
bool bfs(int u, int v)
{
queue<int> q;
for(int i=1;i<=n;i++)
{
sel[i]=0;
t[i]=-1;
}
q.push(u);
sel[u]=1;
t[u]=0;
while(!q.empty())
{
int nod=q.front();
q.pop();
for(auto it:g[nod])
{
if(!sel[it])
{
if(f[nod][it]<c[nod][it])
{
q.push(it);
t[it]=nod;
sel[it]=1;
}
}
}
}
return sel[v];
}
int flux_total;
int main()
{
fin>>n>>m;
for(i=1;i<=m;i++)
{
fin>>u>>v;
fin>>c[u][v];
g[u].push_back(v);
g[v].push_back(u);
}
while(bfs(1,n))
{
for(auto it:g[n])
{
int nod=it;
if(t[it]!=-1)
{
int flux_curent=c[nod][n]-f[nod][n];
while(nod!=1)
{
int tata=t[nod];
flux_curent=min(flux_curent,c[tata][nod]-f[tata][nod]);
nod=tata;
}
flux_total+=flux_curent;
nod=it;
f[nod][n]+=flux_curent;
f[n][nod]-=flux_curent;
while(nod!=1)
{
int tata=t[nod];
f[tata][nod]+=flux_curent;
f[nod][tata]-=flux_curent;
nod=tata;
}
}
}
}
fout<<flux_total;
return 0;
}