Help!
查看原帖
Help!
373938
wowwowwow楼主2022/12/17 12:26

弄了半个上午了... 应该是正解的思路

#include<bits/stdc++.h>
#define TEST cout<<"lzx1013" 
#define int long long 
using namespace std;

int n, m, k, a[3000], f[3000][5]; 

int dis[3000][3000];//这里dis先是表示距离,然后表示是否能到达

queue<int> q;

vector<int> g[3000]; 

void BFS(int x, int st){
	q.push(x);
	while(!q.empty()){
		int u = q.front(); q.pop();
		for(auto v : g[u]){
			if(dis[st][v] || st == v) continue; 
			dis[st][v] = dis[st][u] + 1;
			q.push(v);
		} 
	}
	return;
}

signed main(){
	cin >> n >> m >> k;
	for(int i = 2; i <= n; i++){
		cin >> a[i];
	}
	while(m--){
		int a, b;
		cin >> a >> b;
		g[a].push_back(b);
		g[b].push_back(a);
	}

	for(int i = 1; i <= n; i++){
		BFS(i, i);
		for(int j = 1; j <= n; j++){
			if(dis[i][j] <= k + 1 && i != j) dis[i][j] = 1;
			else dis[i][j] = 0;
		}
	}
	for(int i = 2; i <= n; i++){
		for(int j = 2; j <= n; j++){ //第一大 
			if(dis[i][j] && dis[1][j] && a[j] > a[f[i][1]]){
				f[i][1] = j;
			} 
		}
		for(int j = 2; j <= n; j++){ //第二大 
			if(dis[i][j] && dis[1][j] && a[j] > a[f[i][2]] && f[i][1] != j){
				f[i][2] = j;
			} 
		}
		for(int j = 2; j <= n; j++){ //第三大 
			if(dis[i][j] && dis[1][j] && a[j] > a[f[i][3]] && f[i][1] != j && f[i][2] != j)
				f[i][3] = j;
		}
	}
	int ans = 0, ma, mb, mc, md;
	for(int b = 2; b <= n; b++){
		for(int c = 2; c <= n; c++){
			if(!dis[b][c]) continue;
		    for(int i = 1; i <= 3; i++){
				if(f[b][i] == c || f[b][i] == 0) continue;
		    	for(int j = 1; j <= 3; j++){
		    		if(f[c][j] == b || f[c][j] == f[b][i] || f[c][j] == 0) continue;
		    		int sum = a[b] + a[c] + a[f[b][i]] + a[f[c][j]];
					if(sum > ans){
						ans = sum;
						ma = f[b][i]; mb = b; mc = c; md = f[c][j]; 
					}
				}
			}  
		}
	}
	cout << ans;
	return 0;
	
} 
2022/12/17 12:26
加载中...