如题,算法用的是n轮Dijkstra预处理加上暴力DP,理论复杂度 O(n2logn),为什么会过不了?
代码如下:
#include<bits/stdc++.h>
using namespace std;
int n,m,k,dis[2510][2510];
long long pt[2510];
vector<int> g[2510];
long long dp[2510][5],rec[2510][5][5];
void dijkstra(int q){
priority_queue<pair<int,int>> c;
dis[q][q]=0;
for(int i=1;i<=n;i++){
c.push(make_pair(dis[q][i],i));
}
while(!c.empty()){
int t=-1;
while(1){
if(c.empty()) break;
pair<int,int> tem;
tem=c.top();
c.pop();
if(tem.first==dis[q][tem.second]){
t=tem.second;break;
}
}
if(t!=-1){
for(int i=0;i<g[t].size();i++){
if(dis[q][t]+1<dis[q][g[t][i]]){
dis[q][g[t][i]]=dis[q][t]+1;
c.push(make_pair(dis[q][g[t][i]],g[t][i]));
}
}
}
}
}
int main(){
cin>>n>>m>>k;
for(int i=2;i<=n;i++) cin>>pt[i];
for(int i=1;i<=m;i++){
int a,b;
cin>>a>>b;
g[a].push_back(b);
g[b].push_back(a);
}
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++) dis[i][j]=1e8;
for(int i=1;i<=n;i++) dijkstra(i);
for(int i=1;i<=n;i++){
for(int j=0;j<=4;j++) dp[i][j]=-1;
}
dp[1][0]=0;
for(int i=1;i<=4;i++){
for(int j=1;j<=n;j++){
if(dp[j][i-1]>=0){
for(int kk=2;kk<=n;kk++){
if(dis[j][kk]<=k+1&&(j!=4|dis[kk][1]<=k+1)){
bool f=1;
for(int l=1;l<i;l++){
if(rec[j][i-1][l]==kk) f=0;
}
if(f){
if(dp[j][i-1]+pt[kk]>dp[kk][i]){
dp[kk][i]=dp[j][i-1]+pt[kk];
for(int l=1;l<=i;l++){
if(l!=i) rec[kk][i][l]=rec[j][i-1][l];
else rec[kk][i][l]=kk;
}
}
}
}
}
}
}
}
long long ans=0;
for(int i=2;i<=n;i++) if(dis[i][1]<=k+1)ans=max(ans,dp[i][4]);
cout<<ans;
return 0;
}