社区讨论
求调 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 条回复,欢迎继续交流。
正在加载回复...