Pagini recente » Cod sursa (job #2208336) | Cod sursa (job #2647914) | Cod sursa (job #2219770) | Cod sursa (job #1821685) | Cod sursa (job #1872676)
#include<cstdio>
#include<vector>
#include<queue>
#include<cstring>
#define nmax 1000
using namespace std;
int fluxmaxim,c[nmax+1][nmax+1],f[nmax+1][nmax+1],sursa,destinatie,n,T[nmax+1];
vector <int> lista[nmax+1];
void citire(){
int n1,n2,m,cap;
scanf("%d%d",&n,&m);
for(int i=1;i<=m;i++){
scanf("%d%d%d",&n1,&n2,&cap);
c[n1][n2]=cap;
lista[n1].push_back(n2);
lista[n2].push_back(n1);
}
}
int bfs(){
///graful rezidual pastreaza acele arce pentru care se mai poate adauga flux, adica mai este spatiu flux de adaugat
int ok=0,fiu;///pp ca nu exista drum pana la destinatie
queue <int> coada;
memset(T,0,sizeof(T));
coada.push(sursa);
T[sursa]=-1;
while(!coada.empty()){
int nod=coada.front();
for(int i=0;i<lista[nod].size();i++){
fiu=lista[nod][i];
if(T[fiu]==0/*daca nu a fost vizitat*/ &&c[nod][fiu]>f[nod][fiu])
if(fiu!=destinatie){
T[fiu]=nod;
coada.push(fiu);
}
else
ok=1;
}
coada.pop();
}
return ok;
}
int dinic(){
int drum,nod,min;
//drum primeste 1 daca exista
for(drum=bfs();drum;drum=bfs())
///parcurge drumul de la destinatie la vecinii sai
for(int i=0;i<lista[destinatie].size();i++){
nod=lista[destinatie][i];
if(T[nod]!=0&&c[nod][destinatie]>f[nod][destinatie]){
T[destinatie]=nod;
min=2000000000;
for(int nod=destinatie;nod!=sursa;nod=T[nod])
if(min>c[T[nod]][nod]-f[T[nod]][nod])
min=c[T[nod]][nod]-f[T[nod]][nod];
if(min<=0)
continue;///sare peste ce a ramas din for
fluxmaxim+=min;
for(int nod=destinatie;nod!=sursa;nod=T[nod]){
f[T[nod]][nod]+=min;
f[nod][T[nod]]-=min;
}
}
}
}
int main(){
freopen("maxflow.in","r",stdin);
freopen("maxflow.out","w",stdout);
citire();
sursa=1;
destinatie=n;
dinic();
printf("%d",fluxmaxim);
return 0;
}