小样例过了,大样例炸了好像,但是不知为何
思路 BFS
求调
#include<bits/stdc++.h>
using namespace std;
struct node{
int step,x,cnt;
//step步数<=k x实时位置 过了cnt个景点<=4
int chs[5];//选的景点
}q[30000000];
int n,m,k;
long long sc[3000],ans;
int vi[2700][30100],minn[2700];
//算minn
int xxx[2700];
int main()
{
// freopen("holiday3.in","r",stdin);
// freopen("holidayday.txt","w",stdout);
cin>>n>>m>>k;
memset(minn,-1,sizeof(minn));
for(int i=2;i<=n;i++) scanf("%d",&sc[i]);
sc[1]=0;
for(int i=1;i<=m;i++)
{
int xx,yy;
scanf("%d%d",&xx,&yy);
if(xx==1) minn[yy]=0,xxx[++xxx[0]]=yy;
if(yy==1) minn[xx]=0,xxx[++xxx[0]]=xx;
vi[xx][++vi[xx][0]]=yy;
vi[yy][++vi[yy][0]]=xx;
}
// for(int i=1;i<=n;i++)
// {
// cout<<i<<endl;
// for(int j=1;j<=vi[i][0];j++)
// {
// cout<<vi[i][j]<<" ";
// }
// cout<<endl;
// }
// cout<<endl;
for(int i=1;i<=xxx[0];i++)//计算每个景点到家的最短路
{
int xx=xxx[i];
for(int j=1;j<=vi[xx][0];j++)
{
int kk=vi[xx][j];
int dd=minn[xx]+1;
if(minn[kk]==-1||minn[kk]>dd) minn[kk]=dd,xxx[++xxx[0]]=kk;
}
}
minn[1]=0;
// for(int i=1;i<=n;i++) cout<<minn[i]<<endl;
// cout<<endl;
q[1].step=-1,q[1].x=1;
int h=1,t=1;
while(h<=t)
{
node e=q[h],v;
for(int i=1;i<=vi[e.x][vi[e.x][0]];i++)
{
v=e;
v.step++;
if(v.step>k) break;
if(v.cnt>=4) break;
v.x=vi[e.x][i];
q[++t]=v;
if(vi[e.x][i]==1||vi[e.x][i]==v.chs[1]||vi[e.x][i]==v.chs[2]||vi[e.x][i]==v.chs[3]||vi[e.x][i]==v.chs[4]) continue;
v.cnt++;
v.chs[v.cnt]=vi[e.x][i];
v.step=-1;
if(v.cnt==4&&(minn[v.chs[v.cnt]]==-1||minn[v.chs[v.cnt]]>k)) continue;
if(v.cnt==4)
{
long long sum=sc[v.chs[1]]+sc[v.chs[2]]+sc[v.chs[3]]+sc[v.chs[4]];
if(ans<sum)
{
ans=sum;
// cout<<v.chs[1]<<" "<<v.chs[2]<<" "<<v.chs[3]<<" "<<v.chs[4]<<endl;
// cout<<sc[v.chs[1]]<<" "<<sc[v.chs[2]]<<" "<<sc[v.chs[3]]<<" "<<sc[v.chs[4]]<<endl;
}
}
q[++t]=v;
}
h++;
}
cout<<ans;
return 0;
}