rt,ccf 数据强度和什么 oj 类似。
S 组 A 题 O(n4) 枚举赛时降智,从上一个枚举点编号 +1 开始然后没测大样例。
目前 luogu 60, inf 65, jsk 70, 小图灵 85,ccf 大约能拿多少。
k=0 我特判就没写 n4 的做法。
#include <bits/stdc++.h>
using namespace std;
const int N = 2505;
int n, m, k;
long long a[N];
vector<int> G[N];
bool v[N];
long long d[N][N];
long long ans = 0;
void dfs(int u, int cnt, long long sum)
{
if (cnt == 5 && u == 1)
{
ans = max(ans, sum);
return;
}
if (cnt == 5) return;
v[u] = 1;
for (int j = 0; j < G[u].size(); j++)
{
int np = G[u][j];
if (!v[np] || np == 1)
{
dfs(np, cnt + 1, sum + a[np]);
//printf("%lld %lld\n", u, np);
}
}
v[u] = 0;
}
void bfs(int st)
{
queue<int> q;
q.push(st);
d[st][st] = 0;
while (q.size())
{
int u = q.front();
q.pop();
for (int i = 0; i < G[u].size(); i++)
{
int j = G[u][i];
if (d[st][j] == -1)
{
d[st][j] = d[st][u] + 1;
q.push(j);
}
}
}
for (int i = 1; i <= n; i++) d[st][i]--;
}
long long maxn[N], maxn2[N];
int main()
{
//freopen("holiday.in", "r", stdin);
//freopen("holiday.out", "w", stdout);
memset(d, -1, sizeof d);
scanf("%d%d%d", &n, &m, &k);
for (int i = 2; i <= n; i++)
{
scanf("%lld", &a[i]);
}
for (int i = 1; i <= m; i++)
{
int u, v;
scanf("%d%d", &u, &v);
G[u].push_back(v);
G[v].push_back(u);
}
if (k == 0)
{
dfs(1, 0, 0);
printf("%lld\n", ans);
}
else
{
for (int i = 1; i <= n; i++) bfs(i);
for (int i = 1; i <= n; i++)
{
if (i == 1 || d[1][i] > k) continue;
for (int j = i + 1; j <= n; j++)
{
if (d[i][j] > k) continue;
for (int kk = j + 1; kk <= n; kk++)
{
if (d[j][kk] > k) continue;
for (int kkk = kk + 1; kkk <= n; kkk++)
{
if (d[kk][kkk] > k || d[kkk][1] > k) continue;
ans = max(ans, a[i] + a[j] + a[kk] + a[kkk]);
}
}
}
}
printf("%lld\n", ans);
}
return 0;
}