为什么会TLE70分
查看原帖
为什么会TLE70分
302584
DottedCalculator楼主2022/11/9 21:02

如题,算法用的是n轮Dijkstra预处理加上暴力DP,理论复杂度 O(n2logn)O (n^2logn),为什么会过不了?

代码如下:

#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;
} 
2022/11/9 21:02
加载中...