社区讨论
求助 55pts
P8817[CSP-S 2022] 假期计划参与者 3已保存回复 6
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 6 条
- 当前快照
- 1 份
- 快照标识符
- @lo18egnx
- 此快照首次捕获于
- 2023/10/22 16:53 2 年前
- 此快照最后确认于
- 2023/11/02 16:42 2 年前
rt,其余 WA
CPP#include<bits/stdc++.h>
using namespace std;
#define int long long
const int nr = 2510;
int n, m, k, value[nr], dis[nr][nr];
vector<int> adj[nr], elig[nr];
bool cmpv(int x, int y) { return value[x] > value[y]; }
void bfs(int start)
{
queue<int> q;
q.push(start);
while (!q.empty())
{
int u = q.front();
q.pop();
for (int i = 0; i < adj[u].size(); i++)
{
if (dis[start][adj[u][i]] != 0) continue;
dis[start][adj[u][i]] = dis[start][u] + 1;
q.push(adj[u][i]);
}
}
}
signed main()
{
cin >> n >> m >> k;
for (int i = 2; i <= n; i++) cin >> value[i];
for (int i = 1; i <= m; i++)
{
int u, v;
cin >> u >> v;
adj[u].push_back(v);
adj[v].push_back(u);
}
for (int i = 1; i <= n; i++) bfs(i);
for (int i = 1; i <= n; i++)
{
for (int j = 1; j <= n; j++)
if (j != i && j != 1 && dis[1][j] <= k + 1 && dis[i][j] <= k + 1)
elig[i].push_back(j);
sort(elig[i].begin(), elig[i].end(), cmpv);
}
int ans = 0;
for (int i = 2; i <= n; i++)
for (int j = 2; j <= n; j++)
{
if (i == j) continue;
if (dis[i][j] > k + 1) continue;
int tans = 0;
int size1 = elig[i].size(), size2 = elig[j].size();
for (int k1 = 0; k1 <= min(size1 - 1, 2ll); k1++)
for (int k2 = 0; k2 <= min(size2 - 1, 2ll); k2++)
if (elig[i][k1] != elig[j][k2] && elig[i][k1] != j && elig[j][k2] != i)
tans = max(tans, value[elig[i][k1]] + value[elig[j][k2]]);
ans = max(ans, tans + value[i] + value[j]);
}
cout << ans << endl;
return 0;
}
回复
共 6 条回复,欢迎继续交流。
正在加载回复...