社区讨论

记录前三个最大值,为什么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 条回复,欢迎继续交流。

正在加载回复...