Pagini recente » Cod sursa (job #673620) | Cod sursa (job #955253) | Cod sursa (job #751073) | Cod sursa (job #2367621) | Cod sursa (job #320216)
Cod sursa(job #320216)
#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);
else return 0;
}
inline int bf()
{
int Q[N], p=0, q=0;
bool use[N];
memset(use, 0, sizeof(bool)*(n+1));
memset(tata, 0, sizeof(tata));
use[1]=1;
Q[0] = 1;
int u;
vit i;
while(p <= q)
{
u = Q[p++];
for(i=A[u].begin(); i != A[u].end(); ++i)
if(a[u][*i] && !use[*i])
{
tata[*i]=u;
Q[++q]=*i;
use[*i]=1;
if(*i == n) return 1;
}
}
return 0;
}
int sink;
inline bool dfs(int n)
{
used[n]=1;
if(n == sink) return 1;
for(vit i=A[n].begin(); i != A[n].end(); ++i)
if(!used[*i])
if(a[n][*i])
if(dfs(*i) == 1) {tata[*i]=n; return 1;}
else tata[*i]=n;
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;
sink=n;
//init();
while (1)
{
memset(tata, 0, sizeof(tata));
memset(used, 0, sizeof(used));
//printf("hello\n");
if(!dfs(1)) break;
//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;
}