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