麻烦各位大佬了,样例数据全是对的。
#include<bits/stdc++.h>
using namespace std;
const int maxn = 2e5+5;
typedef pair<int,int>Pair;
priority_queue <Pair,vector<Pair>,greater<Pair> > q;
struct nds{
int nxt,val,c;
}e[maxn];
int lk[maxn],ltp;
void ist(int x,int y){
e[++ltp] = {lk[x],y,1};
lk[x] = ltp;
e[++ltp] = {lk[y],x,1};
lk[y] = ltp;
}
int dp[2505][2505];
long long val[2505];
void dijkstra(int s,int n){
dp[s][s] = 0;
q.push(Pair(0,s));
while(!q.empty()){
Pair p = q.top();
q.pop();
int v = p.second;
if(dp[s][v]<p.first){
continue ;
}
for(int i=lk[v];i;i = e[i].nxt){
if(dp[s][e[i].val] == -1){
dp[s][e[i].val] = dp[s][v]+e[i].c;
// dp[e[i].val][s] = dp[s][e[i].val] ;
q.push(Pair(dp[s][e[i].val],e[i].val));
}
if(dp[s][e[i].val]>dp[s][v]+e[i].c){
dp[s][e[i].val]=dp[s][v]+e[i].c;
// dp[e[i].val][s] = dp[s][e[i].val] ;
q.push(Pair(dp[s][e[i].val],e[i].val));
}
}
}
return ;
}
bool mp[2505][2505];
long long ans[2505][10];
void bfs(int x,int depth,int n){
if(depth == 5){
return ;
}
for(int i=1;i<=n;i++){
if(x==i)continue;
if(mp[x][i]){
if(ans[i][depth+1]<=ans[x][depth]+val[i]){
if(i == 1&&depth<4){
continue ;
}
ans[i][depth+1] = ans[x][depth]+val[i];
int tmp = val[x];
val[x] = 0;
bfs(i,depth+1,n);
val[x] = tmp;
}
}
}
}
int main(){
int n,m,k;
memset(dp,-1,sizeof(dp));
cin >> n >> m >> k;
for(int i=2;i<=n;i++){
cin >> val[i];
}
for(int i=1;i<=m;i++){
int l,r;
cin >> l >> r;
ist(l,r);
}
//找出所有边小于k的节点
for(int i=1;i<=n;i++){
dijkstra(i,n);
}
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
if(i == j)continue;
if(dp[i][j]<=k+1){
mp[i][j] = 1;
}
else{mp[i][j] = 0;}
}
}
bfs(1,0,n);
cout << ans[1][5];
return 0;
}