mxqz 民间数据哇了三个点
查看原帖
mxqz 民间数据哇了三个点
390770
D2T1xubiaoshi楼主2022/11/8 22:58
/*
    name: [CSP-S 2022] 假期计划
    id:   P8817
    date: 2022/11/8
*/

#include <bits/stdc++.h>
using namespace std;
typedef unsigned long long ll;

const int N = 2510;
int n, m, k, f[N][N];
int g[N][3];
ll s[N];
vector<int> G[N];
queue<int> q;

void bfs(int s){
	q.push(s);
	f[s][s] = 0;
	while(!q.empty()){
		int x = q.front();
		q.pop();
		for(int i = 0; i < G[x].size(); ++ i){
			int y = G[x][i];
			if(f[s][y] == 0x3f3f3f3f && y != s){
				f[s][y] = f[s][x] + 1;
				q.push(y);
			} 
		}
	}
}
ll jdge(int a, int b, int c, int d){
	if(a == c || a == d || d == b || d == a){
		return 0;
	}
	return s[a] + s[b] + s[c] + s[d];
}

int main(){
	scanf("%d", &n);
	scanf("%d", &m);
	scanf("%d", &k);
	for(int i = 2; i <= n; ++ i){
		scanf("%lld", &s[i]);
	}
	for(int i = 1; i <= m; ++ i){
		int x, y;
		scanf("%d", &x);
		scanf("%d", &y);
		G[x].push_back(y);
		G[y].push_back(x);
	}
	memset(f, 0x3f, sizeof(f));
	for(int i = 1; i <= n; ++ i){
		bfs(i);
	}
	for(int i = 2; i <= n; ++ i){
		for(int j = 2; j <= n; ++ j){
			if(j == i){
				continue;
			}
			if(f[1][j] - 1 <= k && f[j][i] - 1 <= k){
				if(s[j] > s[g[i][0]]){
					g[i][2] = g[i][1];
					g[i][1] = g[i][0];
					g[i][0] = j;
				} else if(s[j] > s[g[i][1]]){
					g[i][2] = g[i][1];
					g[i][1] = j;
				} else if(s[j] > s[g[i][2]]){
					g[i][2] = j;
				}
			}
		}
	}
	ll ans = 0;
	for(int B = 2; B <= n; ++ B){
		for(int C = 2; C <= n; ++ C){
			if(!g[B][0] || !g[C][0] || B == C || f[B][C] - 1 > k){
				continue;
			}
			for(int i = 0; i < 3; ++ i){
				for(int j = 0; j < 3; ++ j){
					ans = max(ans, jdge(g[B][i], B, C, g[C][j]));
				}
			}
		}
	}
	printf("%lld\n", ans);
	return 0;
}


2022/11/8 22:58
加载中...