100分求调
查看原帖
100分求调
1470808
Ambrose0321楼主2025/6/21 18:55

rt,WA hack #5,#6

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int, ll> P;
const int N = 2505;
int n, m, k, dis[N], g[N][N];
P c[N][3];
ll ans, a[N];
queue<int> q;
vector<int> e[N];
int main() {
	scanf("%d%d%d", &n, &m, &k);
	for (int i = 2; i <= n; i++)
		scanf("%lld", &a[i]);
	for (; m--; ) {
		int u, v;
		scanf("%d%d", &u, &v);
		e[u].push_back(v);
		e[v].push_back(u);
	}
	for (int i = 1; i <= n; i++) {
		memset(dis, 127, sizeof(dis));
		dis[i] = 0;
		q.push(i);
		while (!q.empty()) {
			int x = q.front();
			q.pop();
			for (auto y : e[x])
				if (dis[y] > dis[x] + 1)
					dis[y] = dis[x] + 1, q.push(y);
		}
		for (int j = 1; j <= n; j++)
			if (dis[j] <= k + 1)
				g[i][j] = 1;
		g[i][i] = 0;
	}
	for (int i = 2; i <= n; i++) {
		P m1(0, 0), m2(0, 0), m3(0, 0);
		for (int j = 1; j <= n; j++)
			if (g[1][j] && g[i][j] && i != j) {
				P p(a[j], j);
				if (p > m1)
					m3 = m2, m2 = m1, m1 = p;
				else {
					if (p > m2)
						m3 = m2, m2 = p;
					else
						m3 = max(m3, p);
				}
			}
		c[i][0] = m1;
		c[i][1] = m2;
		c[i][2] = m3;
	}
	for (int u1 = 2; u1 <= n; u1++)
		for (int u2 = u1 + 1; u2 <= n; u2++)
			if (g[u1][u2])
				for (int p1 = 0; p1 < 3; p1++)
					for (int p2 = 0; p2 < 3; p2++) {
						int v1 = c[u1][p1].second, v2 = c[u2][p2].second;
						if (v1 && v2 && v1 != u2 && v2 != u1 && v1 != v2)
							ans = max(ans, a[u1] + a[u2] + a[v1] + a[v2]);
					}
	printf("%lld\n", ans);
}
2025/6/21 18:55
加载中...