Pagini recente » Cod sursa (job #1165115) | Cod sursa (job #1123301) | Cod sursa (job #1499735) | Cod sursa (job #1416725) | Cod sursa (job #320206)
Cod sursa(job #320206)
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <fstream>
#define N 1001
#include <vector>
using namespace std;
int a[N][N];
int n;
#define oo 0x3f3f3f3f
#define pb push_back
typedef vector<int> vi;
typedef vector<int>::iterator vit;
vi A[N];
void read_file(char* buff_file)
{
int m;
ifstream f(buff_file);
f>>n;
f>>m;
int left,right,value;
int i;
for (i=1;i<=m;++i)
{
f>>left>>right>>value;
a[left][right]=value;
A[left].pb(right);
A[right].pb(left);
}
}
int tata[N];
int v[N];
int nr;
bool used[N];
int bfs(int i=1)
{
for (vit j=A[v[i]].begin(); j != A[v[i]].end(); ++j)
if (a[v[i]][*j]!=0 && used[*j]==0)
{
tata[*j]=v[i];
v[++nr]=*j;
used[*j]=1;
if (*j==n)
return 1;
}
if (i<nr)
bfs(i+1);
return 0;
}
void init()
{
memset(used,0,sizeof(bool)*(n+1));
used[1]=1;
memset(v,0,sizeof(int)*(n+1));
v[1]=1;
nr=1;
int i;
for (i=1;i<=n;++i)
tata[i]=1;
tata[1]=0;
}
int max_flow()
{
int flux=0;
int min;
int i;
init();
while (bfs(1))
{
//cout<<"1";
min=oo;
for (i=n;i!=1;i=tata[i])
{
if (min > a[tata[i]][i])
min=a[tata[i]][i];
}
for (i=n;i!=1;i=tata[i])
{
a[tata[i]][i]-=min;
a[i][tata[i]]+=min;
}
init();
flux+=min;
}
return flux;
}
int main()
{
read_file("maxflow.in");
ofstream g("maxflow.out");
g<<max_flow()<<"\n";
return 0;
}