为什么答案开 double 就0分,开long long 就100分?
double 本地 windows/linux 均过了大样例
#include<bits/stdc++.h>
using namespace std;
const int N=2505;
int n,m,k;
int a[N][N],sz[N];
double v[N];
struct Data{int x,z;};
bool operator < (Data x,Data y){return x.z>y.z;}
priority_queue<Data> q;
int dis[N][N],b[N][N],vis[N];
double mx[N],se[N],th[N];
int mxp[N],sep[N],thp[N];
bool chk(int i,int j,int k,int l){
if(i==l||j==k||k==l||k==0||l==0) return 0;
return 1;
}
int main(){
// freopen("holiday.in","r",stdin);
// freopen("holiday.out","w",stdout);
scanf("%d%d%d",&n,&m,&k);k++;
for(int i=2;i<=n;++i) scanf("%lf",&v[i]);
for(int i=1,u,v;i<=m;++i){
scanf("%d%d",&u,&v);a[u][sz[u]++]=v,a[v][sz[v]++]=u;
}
memset(dis,0x3f3f3f3f,sizeof(dis));
for(int i=1;i<=n;++i){
memset(vis,0,sizeof(vis));
dis[i][i]=0;q.push({i,dis[i][i]});
while(!q.empty()){
int x=q.top().x;q.pop();
if(vis[x]) continue;vis[x]=1;
for(int j=0,y;j<sz[x];++j){
y=a[x][j];
if(dis[i][y]>dis[i][x]+1) dis[i][y]=dis[i][x]+1,q.push({y,dis[i][y]});
}
}
}
for(int i=1;i<=n;++i)
for(int j=1;j<i;++j)
if(dis[i][j]<=k) b[i][j]=b[j][i]=1;
for(int i=2;i<=n;++i){
for(int j=2;j<=n;++j)
if(b[1][j]&&b[j][i]){
if(v[j]>=mx[i]) th[i]=se[i],thp[i]=sep[i],se[i]=mx[i],sep[i]=mxp[i],mx[i]=v[j],mxp[i]=j;
else if(v[j]>=se[i]) th[i]=se[i],thp[i]=sep[i],se[i]=v[j],sep[i]=j;
else if(v[j]>=th[i]) th[i]=v[j],thp[i]=j;
}
mx[i]+=v[i],se[i]+=v[i],th[i]+=v[i];
}
double ans=0;
for(int i=2;i<=n;++i)
for(int j=2;j<=n;++j)//enum b,c
if(b[i][j]){
if(chk(i,j,mxp[i],mxp[j])) ans=max(ans,mx[i]+mx[j]);
else if(chk(i,j,mxp[i],sep[j])) ans=max(ans,mx[i]+se[j]);
else if(chk(i,j,mxp[i],thp[j])) ans=max(ans,mx[i]+th[j]);
if(chk(i,j,sep[i],mxp[j])) ans=max(ans,se[i]+mx[j]);
else if(chk(i,j,sep[i],sep[j])) ans=max(ans,se[i]+se[j]);
else if(chk(i,j,sep[i],thp[j])) ans=max(ans,se[i]+th[j]);
if(chk(i,j,thp[i],mxp[j])) ans=max(ans,th[i]+mx[j]);
else if(chk(i,j,thp[i],sep[j])) ans=max(ans,th[i]+se[j]);
else if(chk(i,j,thp[i],thp[j])) ans=max(ans,th[i]+th[j]);
}
printf("%.0lf\n",ans);
return 0;
}