官方数据A了,但民间数据#5WA了
查看原帖
官方数据A了,但民间数据#5WA了
464528
见贤思齐_Seakies楼主2022/11/11 20:54
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
const int MAXN = 2505;
const int MAXM = 1e4 + 5;
int n, m, k;
LL w[MAXN], ans;
struct Edge {
	int to, nxt;
} e[MAXM * 2];
int h[MAXN], cnt;
void addedge(int u, int v) {
	e[cnt].to = v, e[cnt].nxt = h[u], h[u] = cnt++;
}
int dis[MAXN][MAXN], f[MAXN][5];
void bfs(int s) {
	queue<int> q;
	q.push(s);
	dis[s][s] = 0;
	while (!q.empty()) {
		int u = q.front();
		q.pop();
		for (int i = h[u]; ~i; i = e[i].nxt) {
			int v = e[i].to;
			if (~dis[s][v]) continue;
			dis[s][v] = dis[s][u] + 1;
//			cout << s << ' ' << v << ' ' << dis[s][v] << endl;
			q.push(v);
		}
	}
}
LL check(int a, int b, int c, int d) {
	if (!a || !b || !c || !d) return 0;
	if (a == b || a == c || a == d || b == c || b == d || c == d) return 0;
	if (dis[a][b] > k || dis[c][d] > k || dis[1][a] > k || dis[1][d] > k) return 0;
	return w[a] + w[b] + w[c] + w[d];
}
int main() {
	memset(h, -1, sizeof(h));
	memset(dis, -1, sizeof(dis));
	cin >> n >> m >> k;
	k++;
	for (int i = 2; i <= n; i++)
		cin >> w[i];
	for (int i = 1; i <= m; i++) {
		int u, v;
		cin >> u >> v;
		addedge(u, v);
		addedge(v, u);
	}
	for (int i = 1; i <= n; i++)
		bfs(i);
	for (int u = 2; u <= n; u++)
		for (int v = 2; v <= n; v++)
			if (~dis[u][v] && ~dis[1][v] && dis[u][v] <= k && dis[1][v] <= k) {
				int x = v;
				if (w[x] > w[f[u][1]]) swap(x, f[u][1]);
				if (w[x] > w[f[u][2]]) swap(x, f[u][2]);
				if (w[x] > w[f[u][3]]) swap(x, f[u][3]);
			}
//	for (int u = 2; u <= n; u++) {
//		cout << f[u][1] << ' ' << f[u][2] << ' ' << f[u][3] << endl;
//	}
	for (int b = 2; b <= n; b++)
		for (int c = 2; c <= n; c++)
			if (~dis[b][c] && dis[b][c] <= k && b != c)
				for (int i = 1; i <= 3; i++) 
					for (int j = 1; j <= 3; j++)
						ans = max(ans, check(f[b][i], b, c, f[c][j]));
	cout << ans << endl;
	return 0;
}
2022/11/11 20:54
加载中...