求助KM,T飞了
查看原帖
求助KM,T飞了
235657
hwx12233楼主2020/8/9 18:58

RT

#include<cstdio>
#include<iostream>
#include<cmath>
#include<algorithm>
#include<cstring>
using namespace std;

typedef long long ll;
const int inf = 1e9 + 7;
const int N = 510;

int n, c[N][N], l[N], r[N], vis_l[N], vis_r[N], minn, p[N], ans1, ans2;
int a[N][N];

inline int read () {
	int s = 0, w = 1;
	char ch = getchar();
	while(ch < '0' || ch > '9') {
		if(ch == '-') w = -1;
		ch = getchar();
	}
	while(ch >= '0' && ch <= '9') {
		s = s * 10 + ch - '0';
		ch = getchar();
	}
	return s * w;
}
bool dfs(int x) {
	vis_l[x] = 1;
	for(int i = 1; i <= n; i ++ ) {
		if(!vis_r[i]) {
			int tmp = l[x] + r[i] - c[x][i];
			if(!tmp) {
				vis_r[i] = 1;
				if(!p[i] || dfs(p[i])) {
					p[i] = x;
					return 1;
				}
			}
			else if(tmp > 0) minn = min(minn, tmp);
		}
	}
	return 0;
}
int km() {
	for(int i = 1; i <= n; i ++ ) l[i] = -inf, p[i] = 0;
	for(int i = 1; i <= n; i ++ ) for(int j = 1; j <= n; j ++ ) l[i] = max(l[i], c[i][j]);
	for(int i = 1; i <= n; i ++ ) {
		memset(vis_l, 0, sizeof(vis_l));
		memset(vis_r, 0, sizeof(vis_r));
		while(1) {
			minn = inf;
			if(dfs(i)) break;
			for(int j = 1; j <= n; j ++ ) if(vis_l[j]) l[j] -= minn;
			for(int j = 1; j <= n; j ++ ) if(vis_r[j]) r[j] += minn;
		}
	}
}
int main () {
	n = read();
	for(int i = 1; i <= n; i ++ ) for(int j = 1; j <= n; j ++ ) c[i][j] = read();
	km();
	for(int i = 1; i <= n; i ++ ) ans2 += c[p[i]][i];
	for(int i = 1; i <= n; i ++ ) for(int j = 1; j <= n; j ++ ) c[i][j] *= -1;
	km();
	for(int i = 1; i <= n; i ++ ) ans1 += c[p[i]][i];
	printf("%d\n%d\n", -ans1, ans2);
	return 0;
}
2020/8/9 18:58
加载中...