Pagini recente » Cod sursa (job #2457535) | Cod sursa (job #1863050) | Cod sursa (job #3258694) | Cod sursa (job #1164957) | Cod sursa (job #1520027)
#include <fstream>
#include <vector>
#include <string.h>
using namespace std;
ifstream fin("maxflow.in");
ofstream fout("maxflow.out");
vector <int>G[1005];
int p[1005],flx,c[1005][1005],fol[1005][1005],f,x,y,n,i,ic,sc,a[1005],Min;
bool viz[1005];
bool bfs(int i, int f)
{
memset(viz,0,1005);
memset(p,0,1005);
viz[i]=1;
ic=1;
sc=1;
a[1]=1;
while(ic<=sc)
{
int nod=a[ic];
for(int j=0;j<G[nod].size();j++)
if(viz[G[nod][j]]==0&&c[nod][G[nod][j]]-fol[nod][G[nod][j]]>0)
{
sc++;
a[sc]=G[nod][j];
viz[G[nod][j]]=1;
p[G[nod][j]]=nod;
}
ic++;
}
return viz[f];
}
int main()
{
int cost,sum=0;
fin>>f>>n;
for(i=1;i<=n;i++)
{
fin>>x>>y>>cost;
c[x][y]=cost;
G[x].push_back(y);
G[y].push_back(x);
}
while(bfs(1,f))
for(int i=0;i<G[f].size();i++)
{
int nod=G[f][i];
int Min=c[nod][f]-fol[nod][f];
if(Min==0||viz[nod]==0)
continue;
int j=nod;
while(j>1)
{
Min=min(Min,c[p[j]][j]-fol[p[j]][j]);
j=p[j];
}
sum+=Min;
fol[nod][f]+=Min;
fol[f][nod]-=Min;
j=nod;
while(j>1)
{
fol[p[j]][j]+=Min;
fol[j][p[j]]-=Min;
j=p[j];
}
}
fout<<sum;
return 0;
}