对于松弛操作不同写法的一点疑问
查看原帖
对于松弛操作不同写法的一点疑问
782808
Nazale_楼主2024/9/3 20:54
bool dfs(int u){
	vx[u]=1;
	for (int v=1;v<=n;v++){
		if(!vy[v]){
			if(lx[u]+ly[v]==e[u][v]){
				vy[v]=1;
				if(!py[v] || dfs(py[v])){
					py[v]=u;
					return 1;
				}
			}
			else{
				slack[v]=min(slack[v],lx[u]+ly[v]-e[u][v]);
			}
		}
	}
	return 0;
}
void KM(){
	for (int i=1;i<=n;i++){
		while(1){
			memset(vx,0,sizeof(vx));
			memset(vy,0,sizeof(vy));
			fill(slack+1,slack+1+n,INF);
			d=INF;
			if(dfs(i)) break;
			for (int j=1;j<=n;j++){
				if(!vy[j]) d=min(d,slack[j]);
			}
			for (int j=1;j<=n;j++){
				if(vx[j]) lx[j]-=d;
				if(vy[j]) ly[j]+=d;
			}
		}
	}
}
bool dfs(int u){
	vx[u]=1;
	for (int v=1;v<=n;v++){
		if(!vy[v]){
			if(lx[u]+ly[v]==e[u][v]){
				vy[v]=1;
				if(!py[v] || dfs(py[v])){
					py[v]=u;
					return 1;
				}
			}
			else{
				d=min(d,lx[u]+ly[v]-e[u][v]);
			}
		}
	}
	return 0;
}
void KM(){
	for (int i=1;i<=n;i++){
		while(1){
			memset(vx,0,sizeof(vx));
			memset(vy,0,sizeof(vy));
			d=INF;
			if(dfs(i)) break;
			for (int j=1;j<=n;j++){
				if(vx[j]) lx[j]-=d;
				if(vy[j]) ly[j]+=d;
			}
		}
	}
}

在写的过程中遇到了这样的两种写法,一个记录全局松弛最小量,另一个对每一个求完再扫一遍。

不是很懂为什么在运行时间上大相径庭,前一个会T的点第二个才几十毫秒,做的一些其他的题也是这样。

2024/9/3 20:54
加载中...