Pagini recente » Cod sursa (job #3166036) | Cod sursa (job #690682) | Cod sursa (job #119367) | Cod sursa (job #570963) | Cod sursa (job #574569)
Cod sursa(job #574569)
#include <cstdio>
#include <cstdlib>
#include <list>
#include <cstring>
#include <utility>
using namespace std;
FILE *fin=fopen("maxflow.in","r");
FILE *fout=fopen("maxflow.out","w");
int n,m;
int c[1024][1024];
int f[1024][1024];
int t[1024];
int mm[1024];
list<int> ad[1024];
#define INF 0x3f3f3f3f
int bfs()
{
memset(t, 0xFF, sizeof(int)*n); //fill with -1
t[0]=-2;
mm[0]=INF;
list<int> queue;
queue.push_back(0);
while (!queue.empty())
{
int nr = queue.back();
queue.pop_back();
for (list<int>::iterator i = ad[nr].begin(); i!=ad[nr].end(); i++)
{
if (t[*i]!=-1) continue;
int rezidual = c[nr][*i]-f[nr][*i];
if (rezidual<=0) continue;
mm[*i]=min<int>(rezidual,mm[nr]);
queue.push_back(*i);
t[*i]=nr;
if (*i==n-1)
return mm[n-1];
}
}
return 0;
}
int flow()
{
int mx;
int flw = 0;
while (1)
{
mx = bfs();
if (!mx)
break;
int x = n-1;
while (t[x]>=0)
{
f[t[x]][x]+=mx;
f[x][t[x]]-=mx;
x = t[x];
}
flw+=mx;
};
return flw;
}
int main (int argc, char * const argv[]) {
fscanf(fin, "%d%d",&n,&m);
for (int i=0; i<m; i++)
{
int x,y,cs;
fscanf(fin, "%d%d%d",&x,&y,&cs);
x--; y--;
f[x][y]=f[y][x]=0;
c[x][y]=cs;
c[y][x]=0;
ad[x].push_back(y);
ad[y].push_back(x);
}
fprintf(fout,"%d\n",flow());
fclose(fin);
fclose(fout);
return 0;
}