Mai intai trebuie sa te autentifici.
Cod sursa(job #993838)
Utilizator | Data | 4 septembrie 2013 15:57:39 | |
---|---|---|---|
Problema | Flux maxim | Scor | 10 |
Compilator | cpp | Status | done |
Runda | Arhiva educationala | Marime | 1.87 kb |
#include <cstdio>
#include <algorithm>
#include <vector>
#include <queue>
#include <bitset>
#include <climits>
#include <memory.h>
FILE *f=fopen("maxflow.in","r");
FILE *g=fopen("maxflow.out","w");
#define pb push_back
using namespace std;
const int Nmax = 1005;
const int Mmax = 5005;
queue<int> Q;
int used[Nmax][Nmax];
vector< int > lv[Nmax];
int capacitate[Nmax][Nmax],flux[Nmax][Nmax],tata[Nmax];
int N,M;
inline void get_graph(){
fscanf(f,"%d%d",&N,&M);
int a,b,c;
for(int i=1;i<=M;++i){
fscanf(f,"%d%d%d",&a,&b,&c);
lv[a].pb(b);
lv[b].pb(a);
capacitate[a][b]=c;
}
}
int times=0;
inline bool BFS()
{
++times;
vector<int> ::iterator it;
used[1][1]=1;
Q.push(1);
int k;
while(!Q.empty())
{
k=Q.front();Q.pop();
for(it=lv[k].begin();it!=lv[k].end();++it)
if(!used[times][*it] && capacitate[k][*it]-flux[k][*it]!=0)
{
tata[*it]=k;
used[times][*it] = true;
Q.push(*it);
}
}
return used[times][N];
}
inline void FLOW()
{
int flow=0,nod,fmin;
while(BFS())
for(vector<int> ::iterator it= lv[N].begin();it!=lv[N].end();++it)
{
if(flux[*it][N]==capacitate[*it][N] || ! used[times][*it]) continue;
fmin = INT_MAX/2;
tata[N] = *it;
for(nod = N;nod != 1; nod=tata[nod])
fmin=min(fmin,capacitate[tata[nod]][nod]-flux[tata[nod]][nod]);
if(fmin==0)continue;
for(nod = N;nod != 1; nod=tata[nod])
{
flux[tata[nod]][nod] += fmin;
flux[nod][tata[nod]] -= fmin;
}
flow += fmin;
}
fprintf(g,"%d",flow);
}
int main()
{
get_graph();
FLOW();
return 0;
}