关于dinic的TLE
查看原帖
关于dinic的TLE
251449
hfjh楼主2023/3/28 21:26

优化

1、当前弧优化

for(int i = now[x];i && sum;i = edge[i].next){
	now[x] = i;
	...
}

2、如果一个点被搜过并且没有剩余流量的,那就一定不再搜这个点了

if(!k) d[y] = inf;

3、判断sum是否为0,为0就不继续搜了

for(int i = now[x];i && sum;i = edge[i].next){

4、是否在搜索栈的优化

在dinic的dfs中,请记一个数组来标记某个点是否还在搜索栈中 全部代码:

int dfs(int x,int sum){//sum指进入,res代表需要 
	if(x == t) return sum;
	int res = 0;
	vis[x] = 1;//优化4
	for(int i = now[x];i && sum;i = edge[i].next){//优化1、3
		now[x] = i;//优化1
		int y = edge[i].to;
		if(!vis[y] && d[y] == d[x] + 1 && edge[i].w){
			int k = dfs(y,min(sum,edge[i].w));
			if(!k) d[y] = inf;//优化2
			edge[i].w -= k;
			edge[i ^ 1].w += k;
			sum -= k;
			res += k;
		} 
	}
	vis[x] = 0;//优化4
	return res;
}
2023/3/28 21:26
加载中...