感觉做法假了,又好像没假
求个能叉了我代码的hack,或讲下具体错误原因
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cstdio>
#include<queue>
#include<vector>
using namespace std;
long long ver[20010],nxt[20010],head[20010],tot;
long long n,m,k,a[20010],d[6010][6010],ans;
void add(long long x,long long y){
ver[++tot]=y;
nxt[tot]=head[x],head[x]=tot;
}
struct node{
long long dis,z;
}xx[20010][7];
void dijkstra(int s){
priority_queue< pair<long long,long long> >q;
bool v[20010]={0};
for(int i=1;i<=n;i++)
d[i][s]=0x3f;
d[s][s]=0;
q.push(make_pair(0,s));
while(q.size()){
int x=q.top().second;
q.pop();
if(v[x]==0){
v[x]=1;
for(int i=head[x];i;i=nxt[i]){
int y=ver[i];
if(d[y][s]>d[x][s]+1){
d[y][s]=d[x][s]+1;
q.push(make_pair(-d[y][s],y));
}
}
}
}
}
int main(){
cin>>n>>m>>k;
for(int i=2;i<=n;i++){
scanf("%d",&a[i]);
}
for(int i=1;i<=m;i++){
long long x,y;
cin>>x>>y;
add(x,y);
add(y,x);
}
for(int i=1;i<=n;i++)
dijkstra(i);
for(int i=2;i<=n;i++)
for(int j=2;j<=n;j++){
int kkk=j;
if(d[kkk][i]>k+1||i==kkk) continue;
for(int bb=1;bb<=3;bb++){
if(xx[i][bb].dis<a[kkk]){
int dfh=a[kkk],kkkk=kkk;
kkk=xx[i][bb].dis;
xx[i][bb].dis=dfh;
xx[i][bb].z=kkkk;
}
}
}
for(int i=1;i<=n;i++)
for(int bb=1;bb<=3;bb++)
for(int j=1;j<=n;j++)
for(int cc=1;cc<=3;cc++){
if(xx[i][bb].z==0||xx[j][cc].z==0) continue;
if(d[1][xx[i][bb].z]>k+1||d[xx[j][cc].z][1]>k+1||d[i][j]>k+1) continue;
if(i!=j&&xx[i][bb].z!=xx[j][cc].z&&xx[i][bb].z!=j&&xx[j][cc].z!=i){
/* cout<<"a: "<<xx[i][bb].z<<" "<<xx[i][bb].dis<<endl;
cout<<"b: "<<i<<" "<<a[i]<<endl;
cout<<"c: "<<xx[j][cc].z<<" "<<xx[j][cc].dis<<endl;
cout<<"d: "<<j<<" "<<a[j]<<endl;
cout<<"a+b+c+d: "<<a[i]+a[j]+xx[j][cc].dis+xx[i][bb].dis<<endl;*/
ans=max(a[i]+a[j]+xx[j][cc].dis+xx[i][bb].dis,ans);
/*cout<<"ans: "<<ans<<endl;
cout<<"-----------------------------------"<<endl;*/
}
}
printf("%d",ans);
return 0;
}