社区讨论

求调 95pts WA#4

P10963[ICPC-Shanghai 2004] Islands and Bridges参与者 2已保存回复 2

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
2 条
当前快照
1 份
快照标识符
@mlivljw3
此快照首次捕获于
2026/02/12 11:05
3 周前
此快照最后确认于
2026/02/12 12:10
3 周前
查看原帖
我的代码输出有负的
CPP
#include <bits/stdc++.h>
#define IAKIOI ios::sync_with_stdio(false);cin.tie(nullptr);cout.tie(nullptr);
#define re read()
#define wr(n) write(n)
#define endl puts("")
#define sp putchar(' ')

const int N = 20 + 10, M = (1 << 20) + 10, INF = 0x8f;

using namespace std;

using lint = long long;
using ulint = unsigned long long;
using pii = pair<int, int>;

inline int read() {	
	int f = 1, y = 0;
	char c = getchar();
	while (!isdigit(c)) f = c == '-' ? -1 : f, c = getchar();
	while (isdigit(c)) y = (y << 1) + (y << 3) + (c ^ 48), c = getchar();
	return y * f;
}

inline void write(int x) {
	if(x < 0) putchar('-'), x = -x;
	if(x > 9) write(x / 10);
	putchar(x % 10 + '0');
}

int n, m;
lint val[N];
bool dis[N][N];
lint dp[(1 << 13) + 10][14][14], cnt[(1 << 13) + 10][14][14];

void solve() {
	memset(val, 0, sizeof val);
	memset(dis, 0, sizeof dis);
	memset(dp, INF, sizeof dp);
	memset(cnt, 0, sizeof cnt);
	n = re, m = re;
	for (int i = 0; i < n; i++) val[i] = re;
	for (int i = 0; i < m; i++) {
		int u = re - 1, v = re - 1;
		dis[u][v] = dis[v][u] = 1;
	}
	if (n == 1){ 
		wr(val[0]), sp, wr(1), endl;
		return ;
	}
	for (int i = 0; i < n; i++) for (int j = 0; j < n; j++) if (i != j && dis[i][j]) dp[(1 << i) | (1 << j)][i][j] = val[i] + val[j] + val[i] * val[j], cnt[(1 << i) | (1 << j)][i][j] = 1;
	
	for (int s = 1; s < (1 << n); s++) for (int i = 0; i < n; i++) for (int j = 0; j < n; j++) if (((s >> j) & 1) && ((s >> i) & 1) && i != j && dis[i][j]) for (int k = 0; k < n; k++) if (((s >> k) & 1) && i != k && j != k) {
		int x = dp[(s ^ (1 << i))][j][k] + val[i] + val[i] * val[j] + (dis[i][k] && dis[j][k] ? val[i] * val[j] * val[k] : 0);
		if (dp[s][i][j] < x) dp[s][i][j] = x, cnt[s][i][j] = cnt[(s ^ (1 << i))][j][k];
		else if (dp[s][i][j] == x) cnt[s][i][j] += cnt[(s ^ (1 << i))][j][k];
	}
	lint ans = 0, sum = 0;
	for (int i = 0; i < n; i++) for (int j = 0; j < n; j++) if (i != j && dis[i][j]) {
		if (ans < dp[(1 << n) - 1][i][j]) ans = dp[(1 << n) - 1][i][j], sum = cnt[(1 << n) - 1][i][j];
		else if (ans == dp[(1 << n) - 1][i][j]) sum += cnt[(1 << n) - 1][i][j];
	}
	wr(ans), sp, wr(sum / 2), endl;
}

signed main() {
	IAKIOI;
	int T = re;
	while (T--) {
		solve();
	}
}

回复

2 条回复,欢迎继续交流。

正在加载回复...