思路:floyd对线路处理,四重循环暴力找所有点。
#include<bits/stdc++.h>
using namespace std;
int n,m,k;
unsigned long long pt[2500];
int mp[2500][2500];
int main(){
cin >> n >> m >> k;
for(long long i = 2;i <= n;i++) cin >> pt[i];
memset(mp,0x3f,sizeof(mp));
for(long long i = 0;i < m;i++){
long long x,y;
cin >> x >> y;
mp[x][y] = 1;
mp[y][x] = 1;
}
//floyd
for(long long kk = 1;kk <= n;kk++)
for(long long i = 1;i <= n;i++)
for(long long j = 1;j <= n;j++)
if(mp[i][j] > mp[i][kk] + mp[j][kk])
mp[i][j] = mp[i][kk] + mp[j][kk];
for(long long i = 1;i <= n;i++)
for(long long j = 1;j <= n;j++)
if(i == j) mp[i][j] = 0;
else if(mp[i][j] > k + 1) mp[i][j] = -1;
//暴力yyds
unsigned long long mxpt = 0;
for(long long c1 = 2;c1 <= n - 3;c1++){
for(long long c2 = c1 + 1;c2 <= n - 2;c2++){
for(long long c3 = c2 + 1;c3 <= n - 1;c3++){
for(long long c4 = c3 + 1;c4 <= n;c4++){
if(mp[1][c1] > 0
&& mp[c1][c2] > 0
&& mp[c2][c3] > 0
&& mp[c3][c4] > 0
&& mp[c4][1] > 0){
if(mxpt < pt[c1] + pt[c2] + pt[c3] + pt[c4]){
mxpt = pt[c1] + pt[c2] + pt[c3] + pt[c4];
}
}
}}}}
cout << mxpt;
return 0;
}
蒟蒻。