Leer una tarde, medio comprendido simplemente no entienden ah. .
Primer código en vivo! Figura también construir gigante decirlo que hacerlo! !
BFS es, probablemente, pensando:
Cada BFS todo de nuevo, si también se puede encontrar respuestas a aumentar ruta se registra
cada vez que resolver juntos la respuesta, al mismo tiempo, una operación maravillosa: precursor de más menos sucesor.
Yo entiendo y siento la misma marca dfs acabada sensación de cancelación que este paso con el fin de eliminar el impacto sobre el comportamiento futuro causado, fácil de encontrar la solución óptima. `
1. Almacenamiento
struct p{
int s,e,num;
} flow[maxn];
//没毛病
for(int i=1;i<=m;i++){
int u,v,w;
scanf("%d%d%d",&u,&v,&w);
flow[i].s=u;
flow[i].e=v;
flow[i].num=w;
}
2. Clave Sin embargo, no lo haré ah
//大概思路 EK(start,end) 如果还能找到就更新
int EK(int s_pos,int e_pos){
int minn;
while(bfs(s_pos,e_pos)){
minn=inf;
//结构体就是遍历的时候麻烦· 是倒着遍历的
for(int i=e_pos;i!=s;i=flow[pre[i]].s){
minn=min(minn,flow[pre[i]].num);
//flow是从pre[i]出发找到的增广路
}
for(int i=e_pos;i!=s;i=flow[pre[i]].s){
flow[pre[i]].num-=minn;
//这里我不是很明白。。。
flow[pre[i]+m].num+=minn;
}
max_flow+=minn;
}
return max_flow;
}
BFS realización concreta
bool bfs(int s,int e){
//初始化 只要设置成不一样的
s_pos=-1,e_pos=0;
memset(wh,0,sizeof wh);
//标记已经访问
wh[s]=1;
q[0]=s;//q是个队列来着
while(s_pos!=e_pos){
cur_pos=q[++s_pos];/*
for(int i=1;i<=n;++i){
if(!wh[i] && flow[cur_pos][i]>0){
wh[i]=1;//标记往下走
pre[i]=cur_pos;
if(i==e) return 1;
//?
q[++e_pos]=i;
}
} */
for(int i=1;i<=2*m;i++){
if(cur_pos == flow[i].s &&
!wh[flow[i].e] && flow[i].num){
wh[flow[i].e]=1;
pre[flow[i].e]=i;
if(flow[i].e == e) return 1;
q[++e_pos]=flow[i].e;
}
}
}
return 0;
}
Esto todavía es tiempo de espera, espera para mí tomar otra mirada.