hack 全过,原版数据 WA
查看原帖
hack 全过,原版数据 WA
276246
hyk2019楼主2024/10/12 21:09
#include <bits/stdc++.h>
using namespace std;
#define inf 0x3f3f3f3f3f3f3f3f

long long dp[13][1 << 12];
long long con[12][12], cond[1 << 12][12];
int n, m;
int x, y;
long long z;

int main() {
	memset(dp, 0x3f, sizeof dp);
	memset(con, 0x3f, sizeof con);
	memset(cond, 0x3f, sizeof cond);
	scanf("%d%d", &n, &m);
	for(int i = 0; i < m; i ++) {
		scanf("%d%d%lld", &x, &y, &z);
		x --, y --;
		con[x][y] = con[y][x] = min(con[x][y], z);
	}
	for(int i = 0; i < n; i ++)
		con[i][i] = 0;
	for(int i = 0; i < n; i ++)
		for(int x = (1 << n) - 1; x; x --)
			for(int j = 0; j < n; j ++)
				if(x & (1 << j))
					cond[x][i] = min(cond[x][i], con[i][j]);
	for(int i = 0; i < n; i ++)
		dp[0][1 << i] = 0;
	for(int d = 1; d < n; d ++) {
		for(int x = 1, tar = (1 << n) - 2; x < (1 << n); x ++, tar --) {
			for(int y = ((1 << n) - 1) ^ x; y; y = (y - 1) & tar) {
				long long met = dp[d - 1][x];
				for(int j = 0; j < n; j ++)
					if(y & (1 << j))
						if((met += cond[x][j] * d) >= inf) {
							met = inf;
							break;
						}
				dp[d][x | y] = min(dp[d][x | y], met);
			}
		}
	}
	long long res = dp[0][(1 << n) - 1];
	for(int i = 1; i < n; i ++)
		res = min(res, dp[i][(1 << n) - 1]);
	printf("%lld", res);
	return 0;
}

如果 inf 太大,cond[x][j] * d 会爆,可以用累加代替。

2024/10/12 21:09
加载中...