Pagini recente » Cod sursa (job #955250) | Cod sursa (job #651225) | Cod sursa (job #3129384) | Cod sursa (job #957184) | Cod sursa (job #320289)
Cod sursa(job #320289)
//scaling max flow
#include <cstdio>
#include <cstdlib>
#include <string>
#include <vector>
#define N 1001
using namespace std;
int cap[N][N];
typedef vector<int> vi;
typedef vector<int>::iterator vit;
#define pb push_back
#define oo 0x3f3f3f3f
vector<int> a[N];
int n, m;
int t[N];
int maxc;
void read()
{
freopen("maxflow.in","r",stdin);
scanf("%d %d\n", &n, &m);
int p, q, c;
while(m--)
{
scanf("%d %d %d\n", &p, &q, &c);
a[p].pb(q);
a[q].pb(p);
cap[p][q]=c;
if(c > maxc) maxc=c;
}
}
inline int bfs(int mincap)
{
int Q[N], p=0,q=0,u;
bool use[N];
vit i;
memset(use, 0, sizeof(use));
memset(t, 0, sizeof(t));
use[1] = 1;
Q[0] = 1;
while(p <= q)
{
u = Q[p++];
for(i = a[u].begin(); i != a[u].end(); ++i)
if(cap[u][*i])// >= mincap)
if(!use[*i])
//if(cap[u][*i])
{
Q[++q] = *i;
t[*i] = u;
use[*i] = 1;
if( *i == n ) return 1;
}
}
if(t[n] == 0) return 0;
return 1;
}
void solve()
{
int i, cnt,j,mn;
int flow=0;
for(cnt=1; cnt <= maxc; cnt<<=1);
// for(; cnt; cnt>>=1)
{
while(bfs(cnt))
{
mn=oo;
for(j=n; j != 1; j = t[j])
mn = min(mn, cap[t[j]][j]);
for(j=n; j != 1; j = t[j])
cap[t[j]][j] -= mn,
cap[j][t[j]] += mn;
flow += mn;
}
}
freopen("maxflow.out","w",stdout);
printf("%d\n", flow);
}
int main()
{
read();
solve();
return 0;
}