P1559 TLE18分求助
查看原帖
P1559 TLE18分求助
531776
LYM20114楼主2023/7/13 11:09
#include <iostream>
#include <cstring>
using namespace std;
int N,p[25][25],q,w[25][25],l[25],r[25],minn;
int visx[25],visy[25];
int match[25];
bool dfs(int u){
	visx[u] = 1;
	for(int i = 1;i <= N;i++){
		if(!visy[i]){
			visy[i] = 1;
			int ans = l[u] + r[i] - w[u][i];
			if(ans == 0){
				if(!match[i] || dfs(match[i])){
					match[i] = u;
					return 1;
				}
			}
			else if(ans > 0) minn = min(minn,ans);
		}
	}
	return 0;
}
void KM(){
	for(int i = 1;i <= N;i++){
		while(1){
			minn = 0x3f3f3f3f;
			memset(visx,0,sizeof visx);
			memset(visy,0,sizeof visy);
			if(dfs(i)) break;
			for(int j = 1;j <= N;j++)
				if(visx[j]) l[j] -= minn;
			for(int j = 1;j <= N;j++)
				if(visy[j]) r[j] += minn;
		}
	}
}
int main(){
	cin >> N;
	for(int i = 1;i <= N;i++)
		for(int j = 1;j <= N;j++)
			cin >> w[i][j];
	for(int i = 1;i <= N;i++)
		for(int j = 1;j <= N;j++){
			cin >> q;
			w[j][i] *= q;
		}
	for(int i = 1;i <= N;i++)
		for(int j = 1;j <= N;j++)
			l[i] = max(l[i],w[i][j]);
	KM();
	int sum = 0;
	for(int i = 1;i <= N;i++)
		sum += w[match[i]][i];
	cout << sum << endl;
	return 0;
}
2023/7/13 11:09
加载中...