比赛 |
CSP2022提高组 |
评测结果 |
AAAAAAWWWWWAAAAWWWWA |
题目名称 |
假期计划 |
最终得分 |
55 |
用户昵称 |
00000 |
运行时间 |
1.445 s |
代码语言 |
C++ |
内存使用 |
22.48 MiB |
提交时间 |
2022-10-30 11:27:30 |
显示代码纯文本
#include<bits/stdc++.h>
#define ll long long
using namespace std;
ll n,m,k,a[5000],ans;
vector<ll> g[5000];
queue<ll> p;
ll dl[3000][3000];//最短路
ll mem[5000];
ll b1[3000],b2[3000],b3[3000];
void dfs(ll x,ll r,ll lx)
{
if(r==3)
{
if(a[lx]>a[b1[x]])
{
b3[x]=b2[x];
b2[x]=b1[x];
b1[x]=lx;
}else
{
if(a[lx]>a[b2[x]])
{
b3[x]=b2[x];
b2[x]=lx;
}else
{
if(a[lx]>a[b3[x]]) b3[x]=lx;
}
}
return;
}
for(int q=1;q<=n;q++)
{
if(mem[q]==0&&dl[x][q]<=k+1)
{
mem[q]=1;
dfs(q,r+1,x);
mem[q]=0;
}
}
}
int main(){
freopen("csp2022_holiday.in","r",stdin);
freopen("csp2022_holiday.out","w",stdout);
cin>>n>>m>>k;
for(int q=2;q<=n;q++) cin>>a[q];
for(int q=1;q<=m;q++)
{
ll x,y;
cin>>x>>y;
g[x].push_back(y);
g[y].push_back(x);
}
for(int q=1;q<=n;q++)
{
dl[q][q]=0;mem[q]=1;
for(ll w:g[q])
{
p.push(w);
dl[q][w]=1;
mem[w]=1;
}
while(p.size())
{
ll x=p.front();
p.pop();
for(ll w:g[x])
{
if(mem[w]==0)
{
p.push(w);
dl[q][w]=dl[q][x]+1;
mem[w]=1;
}
}
}
memset(mem,0,sizeof(mem));
}
mem[1]=1;
dfs(1,1,0);
for(int q=2;q<=n;q++)
{
for(int w=q+1;w<=n;w++)
{
if(dl[q][w]<=k+1)
{
if(b1[q]!=w&&b1[q])
{
if(b1[w]!=q&&b1[w]!=b1[q]&&b1[w]) ans=max(ans,a[q]+a[w]+a[b1[q]]+a[b1[w]]);
if(b2[w]!=q&&b2[w]!=b1[q]&&b2[w]) ans=max(ans,a[q]+a[w]+a[b1[q]]+a[b2[w]]);
if(b3[w]!=q&&b3[w]!=b1[q]&&b3[w]) ans=max(ans,a[q]+a[w]+a[b1[q]]+a[b3[w]]);
}
if(b2[q]!=w&&b2[q])
{
if(b1[w]!=q&&b1[w]!=b2[q]&&b1[w]) ans=max(ans,a[q]+a[w]+a[b2[q]]+a[b1[w]]);
if(b2[w]!=q&&b2[w]!=b2[q]&&b2[w]) ans=max(ans,a[q]+a[w]+a[b2[q]]+a[b2[w]]);
if(b3[w]!=q&&b3[w]!=b2[q]&&b3[w]) ans=max(ans,a[q]+a[w]+a[b2[q]]+a[b3[w]]);
}
if(b3[q]!=w&&b3[q])
{
if(b1[w]!=q&&b1[w]!=b3[q]&&b1[w]) ans=max(ans,a[q]+a[w]+a[b3[q]]+a[b1[w]]);
if(b2[w]!=q&&b2[w]!=b3[q]&&b2[w]) ans=max(ans,a[q]+a[w]+a[b3[q]]+a[b2[w]]);
if(b3[w]!=q&&b3[w]!=b3[q]&&b3[w]) ans=max(ans,a[q]+a[w]+a[b3[q]]+a[b3[w]]);
}
}
}
}
cout<<ans;
return 0;
}