Pagini recente » Cod sursa (job #346482) | Cod sursa (job #3172778) | Cod sursa (job #2733394) | Cod sursa (job #1724886) | Cod sursa (job #2329085)
#include <stdio.h>
#include <vector>
using namespace std;
FILE *f,*g;
struct graf
{
int node, next;
}v[10012];
int cost[1002][1002];
int start[1002], used[1002], coada[1002], t[1002];
int n,m,nr=1,flux;
void read()
{
int x,y,c,k=0;
fscanf(f,"%d %d",&n,&m);
for(int i=1; i<=m; i++)
{
fscanf(f,"%d %d %d",&x,&y,&c);
v[++k].node=y, v[k].next=start[x], start[x]=k;
v[++k].node=x, v[k].next=start[y], start[y]=k;
cost[x][y]=c;
}
}
int manim(int a, int b)
{
return a<b ? a:b;
}
bool bfs()
{
int pi,ps,x;
pi=ps=1;
coada[pi]=1;
while(ps<=pi)
{
x=coada[ps];
for(int i=start[x]; i; i=v[i].next)
{
if(used[v[i].node]<nr && cost[x][v[i].node]>0)
{
used[v[i].node]=nr;
t[v[i].node]=x;
if(v[i].node!=n)
coada[++pi]=v[i].node;
}
}
ps++;
}
if(used[n]==nr)
return 1;
return 0;
}
void fluxx()
{ int maxi;
while(bfs())
{
for(int i=start[n]; i; i=v[i].next)
{
if(used[v[i].node]==nr && cost[v[i].node][n]>0)
{
t[n]=v[i].node;
maxi=999999999;
for(int j=n; j!=1; j=t[j])
maxi=manim(maxi,cost[t[j]][j]);
for(int j=n; j!=1; j=t[j])
{
cost[t[j]][j]-=maxi;
cost[j][t[j]]+=maxi;
}
flux+=maxi;
}
}
nr++;
}
}
void write()
{
fprintf(g,"%d",flux);
}
int main()
{
f=fopen("maxflow.in","r");
g=fopen("maxflow.out","w");
read();
fluxx();
write();
fclose(f);
fclose(g);
return 0;
}