RT
其实考场代码第一个判断的第三个分支的else忘记写了,但是加上之后那两个点还是WA
#include <bits/stdc++.h>
using namespace std;
#define int long long
typedef long long ll;
inline ll read() {
ll x = 0, f = 1; char c = getchar();
while (!isdigit(c)) (c == '-') && (f = -1), c = getchar();
while (isdigit(c)) x = (x << 1) + (x << 3) + (c ^ 48), c = getchar();
return f * x;
}
const ll inf = 10000000000000000;
#define m1 aaaaaa
#define m2 bbbbbb
#define m3 cccccc
int n, m, k;
ll val[3010];
int tot, hd[3010], to[50010], nxt[50010];
void addedge(int u, int v) { tot++; nxt[tot] = hd[u]; to[tot] = v; hd[u] = tot; }
queue<int> q;
int d[3010][3010];
int m1[3010], m2[3010], m3[3010];
int vis[3010];
void bfs(int S) {
for (int i = 1; i <= n; i++) d[S][i] = inf, vis[i] = 0;
d[S][S] = 0;
vis[S] = 1;
q.push(S);
while (!q.empty()) {
int u = q.front();
q.pop();
for (int i = hd[u]; i; i = nxt[i]) {
int v = to[i];
if (vis[v]) continue;
d[S][v] = d[S][u] + 1;
vis[v] = 1;
q.push(v);
}
}
}
signed main() {
// freopen("holiday.in", "r", stdin);
// freopen("holiday.out", "w", stdout);
// freopen("holiday3.in", "r", stdin);
// freopen("out.out", "w", stdout);
n = read(), m = read(), k = read();
for (int i = 2; i <= n; i++) {
val[i] = read();
}
for (int i = 1; i <= m; i++) {
int u = read(), v = read();
addedge(u, v); addedge(v, u);
}
for (int i = 1; i <= n; i++) {
bfs(i);
}
// for (int i = 1; i <= n; i++) {
// for (int j = 1; j <= n; j++) {
// printf("d[%lld][%lld]:%lld\n", i, j, d[i][j]);
// }
// }
for (int u = 2; u <= n; u++) {
if (d[1][u] <= 2 * k + 2) {
for (int v = 2; v <= n; v++) {
if (u == v) continue;
if (d[1][v] <= k + 1 && d[v][u] <= k + 1) {
if (val[v] > val[m1[u]]) {
m3[u] = m2[u];
m2[u] = m1[u];
m1[u] = v;
}
else {
if (val[v] > val[m2[u]]) {
m3[u] = m2[u];
m2[u] = v;
}
else {
if (val[v] > val[m3[u]]) {
m3[u] = v;
}
}
}
}
}
}
}
// for (int i = 1; i <= n; i++) {
// printf("%d:::::::m1:%d m2:%d m3:%d\n", m1[i], m2[i], m3[i]);
// }
ll ans = 0;
for (int u = 2; u <= n; u++) {
for (int v = u + 1; v <= n; v++) {
if (d[1][u] <= 2 * k + 2 && d[1][v] <= 2 * k + 2 && d[u][v] <= k + 1) {
if (m1[u] == 0 || m1[v] == 0) continue;
ll calc = val[u] + val[v];
if (m1[u] == v) {
if (m1[v] == u) {
if (m2[u] == m2[v]) {
calc += val[m2[u]] + max(val[m3[u]], val[m3[v]]);
}
else {
calc += val[m2[u]] + val[m2[v]];
}
}
else if (m2[v] == u) {
if (m2[u] == m1[v]) {
calc += val[m2[u]] + max(val[m3[u]], val[m3[v]]);
}
else {
calc += val[m2[u]] + val[m1[v]];
}
}
else {
if (m2[u] == m1[v]) {
calc += val[m2[u]] + max(val[m3[u]], val[m2[v]]);
}
else {
calc += val[m2[u]] + val[m1[v]];
}
}
}
else if (m2[u] == v) {
if (m1[v] == u) {
if (m1[u] == m2[v]) {
calc += val[m1[u]] + max(val[m3[u]], val[m3[v]]);
}
else {
calc += val[m1[u]] + val[m2[v]];
}
}
else if (m2[v] == u) {
if (m1[u] == m1[v]) {
calc += val[m1[u]] + max(val[m3[u]], val[m3[v]]);
}
else {
calc += val[m1[u]] + val[m1[v]];
}
}
else {
if (m1[u] == m1[v]) {
calc += val[m1[u]] + max(val[m3[u]], val[m2[v]]);
}
else {
calc += val[m1[u]] + val[m1[v]];
}
}
}
else {
if (m1[v] == u) {
if (m1[u] == m2[v]) {
calc += val[m1[u]] + max(val[m2[u]], val[m3[v]]);
}
else {
calc += val[m1[u]] + val[m2[v]];
}
}
else if (m2[v] == u) {
if (m1[u] == m1[v]) {
calc += val[m1[u]] + max(val[m2[u]], val[m3[v]]);
}
else {
calc += val[m1[u]] + val[m1[v]];
}
}
else {
if (m1[u] == m1[v]) {
calc += val[m1[u]] + max(val[m2[u]], val[m2[v]]);
}
else {
calc += val[m1[u]] + val[m1[v]];
}
}
}
ans = max(ans, calc);
}
}
}
cout << ans << endl;
return 0;
}