为什么这会超时
查看原帖
为什么这会超时
443023
chenkuo楼主2023/10/16 18:33
#include<bits/stdc++.h>
#define longint long long
using namespace std;
longint n,m,k,x,y,ans,a[2501];
longint f[2501][2501],jl[2501];
vector<longint>v[2501],l[2501];
struct cmp{
	bool operator()(longint x,longint y){
		return a[x]>a[y];
	}
};
int main(){
//	freopen("holiday.in","r",stdin);
//	freopen("holiday.out","w",stdout);
	scanf("%lld%lld%lld",&n,&m,&k);k++;
	for(int i=2;i<=n;i++) scanf("%lld",a+i);
	for(int i=1;i<=m;i++){
		scanf("%lld%lld",&x,&y);
		v[x].push_back(y);
		v[y].push_back(x);
	}
	for(int i=1;i<=n;i++) for(int j=1;j<=n;j++)	f[i][j]=2e18;
	for(int i=1;i<=n;i++){
		queue<longint>q;
		while(!q.empty()) q.pop();
		q.push(i);
		f[i][i]=0;
		while(!q.empty()){
			longint u=q.front();q.pop();
			for(int j=0;j<v[u].size();j++){
				if(f[i][u]+1>k) continue;
				if(f[i][u]+1<f[i][v[u][j]]){
					f[i][v[u][j]]=f[i][u]+1;
					q.push(v[u][j]);
				}
			}
		}
		for(int j=1;j<=n;j++){
			if(f[i][j]<=k&&i!=j) l[i].push_back(j),f[i][j]=1;
			else f[i][j]=0;
		}
	}
	for(int i=2;i<=n;i++){
		for(int j=2;j<=n;j++){
			if(!f[i][j]) continue;
			for(int qj=0;qj<l[i].size();qj++){//l[i][qj]
				for(int qjj=0;qjj<l[j].size();qjj++){//l[j][qjj]
					if(l[i][qj]!=j&&l[j][qjj]!=i&&l[i][qj]!=l[j][qjj]&&f[1][l[i][qj]]&&f[1][l[j][qjj]]){
						ans=max(ans,a[l[i][qj]]+a[l[j][qjj]]+a[i]+a[j]);
					}
				}
			}
		}
	}
	printf("%lld",ans);
} 

好像这个是n^2的啊,是不是常数太大了?

2023/10/16 18:33
加载中...