SAP与Dinic的具体不同看不出来,求大神留言
#include <cstdio>
#include <cstring>
#include <iostream>
#include <cmath>
#define fi(i , st , en) for(int i = st; i <= en; i++)
const int N = 220 , M = 220;
int GAP[M] , now[M] , lim[M] , a[M][M] , dis[M] , bef[M];
int n , m , ans;
int SAP(){
bool flag;
int last , i , Min;
GAP[0] = m;
last = 2147483647;
fi(i , 1 , m) now[i] = 1;
i = 1;
while (dis[1] < m){
lim[i] = last; flag = 0;
fi(j , now[i] , m)
if(dis[j] + 1 == dis[i] && a[i][j]){
if(last > a[i][j]) last = a[i][j];
flag = 1;
bef[j] = i;
now[i] = j;
i = j;
if (i == m){
ans += last;
while (i != 1){
a[bef[i]][i] -= last;
a[i][bef[i]] += last;
i = bef[i];
}
last = 2147483647;
}
break;
}
if (flag) continue;
//resign
Min = m;
int t;
fi(j , 1 , m)
if(a[i][j] && Min > dis[j]){
Min = dis[j];
t = j;
}
now[i] = t;
GAP[dis[i]] --;
if(GAP[dis[i]] == 0 && i != 1) break; //GAP优化:出现了断层,该点的原标号的数量为0,不可能再出现新的该点原标号的点,因为要出现这样的点
dis[i] = Min + 1; //就必先到达该点以下的点,然而有断层并不能到达。
GAP[dis[i]] ++;
if (i != 1){
i = bef[i];
last = lim[i];
}
}
}
int main(){
scanf("%d %d" , &n , &m);
memset(a , 0 , sizeof(a));
fi(i , 1 , n){
int x , y , z;
scanf("%d %d %d" , &x , &y , &z);
a[x][y] += z;
}
SAP();
printf("%d" , ans);
return 0;
}