我嘞个豆,为啥不过 枯了。。。
  • 板块灌水区
  • 楼主XL_hhh
  • 当前回复10
  • 已保存回复10
  • 发布时间2023/10/14 16:39
  • 上次更新2023/11/2 13:53:14
查看原帖
我嘞个豆,为啥不过 枯了。。。
537509
XL_hhh楼主2023/10/14 16:39
#include<bits/stdc++.h>
using namespace std;

typedef long long ll;
queue<int> q;

int n,m,k,cnt=0;
ll f[2507][2507],a[12345],p[2699][2698],ans=0;;
int dis[2599][2599],head[2599];


inline void first(int n){
	for(int i=1;i<=n;i++){
		for(int j=1;j<=n;j++) dis[i][j]=0x7fffffff;
	}
}

struct Edge{
	int next;
	int end;
}edge[30006];

inline void addedge(int start,int end){
	cnt++;				
	edge[cnt].next=head[start];
	head[start]=cnt;	
	edge[cnt].end=end;
}

void bfs(int start,int n){
	dis[start][start]=0;
	q.push(start);
	while(!q.empty()){
		int cur=q.front();
		q.pop();
		for(int i=head[cur];i!=0;i=edge[i].next){
			int x=edge[i].end;
			if(dis[start][x]==0x7fffffff){
				dis[start][x]=dis[start][cur]+1;
				q.push(x);	
			}
		}
	}
}

int main(){
	cin>>n>>m>>k;
	k++;
	first(n);
	
	for(int i=2;i<=n;i++){
		cin>>a[i];
	} 
	
	for(int i=1;i<=m;i++){
		int x,y;
		cin>>x>>y;
		addedge(x,y);
		addedge(y,x);
	}
	
	for(int i=1;i<=n;i++) bfs(i,n);
	
	for(int i=1;i<=n;i++){
		for(int j=1;j<=n;j++){
			if(i!=j&&dis[1][i]<=k&&dis[i][j]<=k){
				f[i][j]=a[i]+a[j];
			}
			else{
				f[i][j]=-4e18;
			} 
		}
	}
	
	for(int i=2;i<=n;i++){
		p[i][1]=p[i][2]=p[i][3]=i;
		for(int j=2;j<=n;j++){
			if(f[p[i][1]][i]<f[j][i]){
				p[i][3]=p[i][2];
				p[i][2]=p[i][1];
				p[i][1]=j;
			}
			if(f[p[i][2]][i]<f[j][i]){
				p[i][3]=p[i][2];
				p[i][2]=j;
			}
			if(f[p[i][3]][i]<f[j][i]){
				p[i][3]=j;
			}
		}
	}
	for(int i=2;i<=n;i++){
		for(int j=2;j<=n;j++){
			if(i!=j&&dis[i][j]<=k){
				for(int l=1;l<=3;l++){
					for(int h=1;h<=3;h++){
						if(p[i][l]!=j&&p[i][l]!=p[j][h]&&p[j][h]!=i){
							ans=max(ans,f[p[i][l]][i]+f[p[j][h]][j]);
							break;
						}						
					}
				}
			}
		}
	}
	cout<<ans;
}

2023/10/14 16:39
加载中...