社区讨论
记录前三个最大值,为什么80pts?
P8817[CSP-S 2022] 假期计划参与者 3已保存回复 5
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 5 条
- 当前快照
- 1 份
- 快照标识符
- @lo7n6cb9
- 此快照首次捕获于
- 2023/10/27 04:33 2 年前
- 此快照最后确认于
- 2023/10/27 04:33 2 年前
直接上代码。
CPP// 洛谷数据 80
#include <bits/stdc++.h>
using namespace std;
#define N 2501
#define ll long long
#define int long long
template <class T>
inline void read(T& a){
T x = 0, s = 1;
char c = getchar();
while(!isdigit(c)){ if(c == '-') s = -1; c = getchar(); }
while(isdigit(c)){ x = x * 10 + (c ^ '0'); c = getchar(); }
a = x * s;
return ;
}
int n, m, k;
struct node{
int u, v, w, next;
} ;
ll a[N];
struct node t[N << 3];
int head[N];
int bian = 0;
inline void addedge(int u, int v, int w){
t[++bian] = (node){u, v, 1, head[u]}, head[u] = bian;
return ;
}
struct point{
ll dis;
int id;
bool operator < (const point& a) const{
return dis > a.dis;
}
} ;
vector <point> G[N];
ll dis[N];
bool vis[N];
bool ok[N][N];
void dijstra(int s){
priority_queue <point> q;
memset(dis, 0x3f3f3f3f3f, sizeof(dis));
memset(vis, 0, sizeof(vis));
dis[s] = 0,
q.push((point){0, s});
while(!q.empty()){
int u = q.top().id; q.pop();
if(!vis[u]){
vis[u] = 1;
for(int i = head[u]; i; i = t[i].next){
int v = t[i].v;
if(dis[v] > dis[u] + t[i].w){
dis[v] = dis[u] + t[i].w;
if(!vis[v]) q.push((point){dis[v], v});
}
}
}
}
for(int i = 1; i <= n; i++){
if(i != s && dis[i] <= k + 1){
G[s].push_back((point){a[i], i});
G[i].push_back((point){a[s], s});
ok[s][i] = ok[i][s] = 1;
}
}
return ;
}
signed main(){
// freopen("hh.txt", "r", stdin);
read(n), read(m), read(k);
for(int i = 2; i <= n; i++) read(a[i]);
for(int i = 1; i <= m; i++){
int x, y;
read(x), read(y);
addedge(x, y, 1);
addedge(y, x, 1);
}
for(int i = 1; i <= n; i++){
dijstra(i);
}
for(int i = 1; i <= n; i++)
sort(G[i].begin(), G[i].end());
ll ans = 0;
for(auto it1 : G[1]){
int u1 = it1.id;
for(auto it2 : G[1]){
int u2 = it2.id;
if(u1 == u2) continue;
ll sum = a[u1] + a[u2];
for(int i = 0; i < min(4ll, (int)G[u1].size()); i++){
for(int j = 0; j < min(4ll, (int)G[u2].size()); j++){
int v1 = G[u1][i].id, v2 = G[u2][j].id;
if(v1 != v2 && v1 != u2 && v2 != u1 && ok[v1][v2]){
ans = max(ans, sum + a[v1] + a[v2]);
// printf("u1 %d u2: %d v1: %d v2: %d\n", u1, u2, v1, v2);
}
}
}
}
}
cout << ans << endl;
return 0;
}
回复
共 5 条回复,欢迎继续交流。
正在加载回复...