Pagini recente » Cod sursa (job #2431497) | Cod sursa (job #2974987) | Istoria paginii utilizator/ucv_urdiniceanu_sperila_mitrica | Cod sursa (job #2718) | Cod sursa (job #431639)
Cod sursa(job #431639)
#include <cstdio>
#include <vector>
#define maxn 1001
using namespace std;
int n,m,sum,min;
int used[maxn],tata[maxn],st[maxn];
int a[maxn][maxn];
vector <int> g[maxn];
int flux,poz;
int minim(int x, int y)
{
return x<y?x:y;
}
int bf()
{
for(int i=1;i<=n;i++)
tata[i]=0;
tata[1]=0;
st[0]=1;
st[1]=1;
for(int i=1;i<=st[0];i++)
for(int j=0;j<g[st[i]].size();j++)
{
if(tata[g[st[i]][j]] || !a[st[i]][g[st[i]][j]])
continue;
tata[g[st[i]][j]]=st[i];
st[++st[0]]=g[st[i]][j];
if(g[st[i]][j]==n)
return 1;
}
return 0;
}
void rezolva()
{
while(bf())
{
for(int i=1;i<=n;i++)
{
if(!tata[i] || !a[i][n])
continue;
flux=a[i][n];
poz=i;
while (poz!=1)
{
flux=minim(flux,a[tata[poz]][poz]);
poz=tata[poz];
}
if(!flux)
continue;
a[n][i]+=flux;
a[i][n]-=flux;
poz=i;
while(poz!=1)
{
a[tata[poz]][poz]-=flux;
a[poz][tata[poz]]+=flux;
poz=tata[poz];
}
sum+=flux;
}
}
printf("%d\n",sum);
}
int main()
{
freopen("maxflow.in","r",stdin);
freopen("maxflow.out","w",stdout);
scanf("%d%d",&n,&m);
int x,y,z;
for(int i=1;i<=m;i++)
{
scanf("%d%d%d",&x,&y,&z);
a[x][y]=z;
g[x].push_back(y);
g[y].push_back(x);
}
used[1]=1;
rezolva();
fclose(stdout);
return 0;
}