TLE求助
查看原帖
TLE求助
616733
Lysea楼主2023/8/11 12:31

95pts,最后一个点T掉了,个人怀疑BFS有问题。

#include<bits/stdc++.h>
#define int long long
#define N 3005
using namespace std;
struct star{
	int next,to,val;
}e[N*100];
struct node{
	int u,step;
};
int n,m,k,dot[N],head[N],cnt,Max[N][4],to[N][4],ans;
bool vis[N][N];
queue<node>q;
void add(int u,int v){
	e[++cnt].next=head[u];
	head[u]=cnt;
	e[cnt].to=v;
}
void bfs(int x){
	while(!q.empty()) q.pop();
	q.push(node{x,0});
	while(!q.empty()){
		int t=q.front().u,s=q.front().step;
		q.pop();
		if(s>k+1) continue;
		vis[x][t]=true;
		for(int i=head[t];i;i=e[i].next){
			int y=e[i].to;
			if(vis[x][y]) continue;
			q.push(node{y,s+1});
		}
	}
}
signed main(){
	scanf("%lld%lld%lld",&n,&m,&k);
	for(int i=2;i<=n;++i) scanf("%lld",&dot[i]);
	for(int i=1,u,v;i<=m;++i){
		scanf("%lld%lld",&u,&v);
		add(u,v),add(v,u);
	}
	for(int i=1;i<=n;++i) bfs(i);
	for(int i=1;i<=n;++i){
		for(int j=1;j<=n;++j){
			if(!vis[i][j]||i==j||!vis[1][j]) continue;
			if(dot[j]>Max[i][1]){
				Max[i][3]=Max[i][2],Max[i][2]=Max[i][1];
				Max[i][1]=dot[j];
				to[i][3]=to[i][2],to[i][2]=to[i][1];
				to[i][1]=j;
			}
			else if(dot[j]>Max[i][2]){
				Max[i][3]=Max[i][2];
				Max[i][2]=dot[j];
				to[i][3]=to[i][2];
				to[i][2]=j;
			}
			else if(dot[j]>Max[i][3]){
				Max[i][3]=dot[j];
				to[i][3]=j;
			}
		}
	}
	for(int b=2;b<=n;++b){
		for(int c=2;c<=n;++c){
			if(b==c||!vis[b][c]) continue;
			for(int i=1;i<=3;++i){
				for(int j=1;j<=3;++j){
					int a=to[b][i],d=to[c][j];
					if(a==c||d==b||a==d||!a||!d) continue;
					ans=max(ans,dot[b]+dot[c]+dot[d]+dot[a]);
				}
			}
		}
	}
	printf("%lld\n",ans);
	return 0;
}
2023/8/11 12:31
加载中...