80分求调
查看原帖
80分求调
252549
Iwara楼主2023/12/14 15:07

RT

#include<bits/stdc++.h>
#include<queue>
using namespace std;
typedef long long ll;
const ll MAXN=2505,MAXM=2e4+5;
ll n,m,k,x,y;
ll w[MAXN];
struct edge{
	ll u,v,nxt;
}e[MAXM];
ll head[MAXN],edge_num;
void add_edge(ll From,ll To){
	edge_num++;
	e[edge_num].u=From;
	e[edge_num].v=To;
	e[edge_num].nxt=head[From];
	head[From]=edge_num;
	return;
}
ll dis[MAXN][MAXN];
bool vis[MAXN];
queue<ll> q;
ll pre[MAXN][3];
void pre_dis(ll st){
	q.push(st);
	for(int i=1;i<=n;i++)dis[st][i]=1e18;
	dis[st][st]=0;
	for(int i=1;i<=n;i++)vis[i]=0;
	while(q.size()){
		ll now=q.front();
		vis[now]=1;
		q.pop();
		if(dis[st][now]>k+1)continue;
		if(now!=st&&now!=1&&dis[st][now]<=k+1&&dis[1][now]<=k+1){
			if(w[now]>w[pre[st][0]])pre[st][2]=pre[st][1],pre[st][1]=pre[st][0],pre[st][0]=now;
			else if(w[now]>w[pre[st][1]])pre[st][2]=pre[st][1],pre[st][1]=now;
			else if(w[now]>w[pre[st][2]])pre[st][2]=now;
		}
		for(int i=head[now];i;i=e[i].nxt){
			if(!vis[e[i].v]){
				dis[st][e[i].v]=dis[st][now]+1;
				q.push(e[i].v);
			}
		}
	}
	return;
}
int main(){
	cin>>n>>m>>k;
	for(int i=2;i<=n;i++)cin>>w[i];
	for(int i=1;i<=m;i++){
		cin>>x>>y;
		add_edge(x,y);
		add_edge(y,x);
	}
	for(int i=1;i<=n;i++)pre_dis(i);
//	for(int i=1;i<=n;i++){
//		for(int j=1;j<=n;j++){
//			cout<<dis[i][j]<<" ";
//		}
//		cout<<endl;
//	}

//	for(int i=2;i<=n;i++)cout<<pre[i][0]<<" "<<pre[i][1]<<" "<<pre[i][2]<<endl;
	ll ans=0;
	for(int i=2;i<=n;i++){
		for(int j=2;j<=n;j++){
			if(dis[i][j]>k+1||i==j)continue;
			for(int bb=0;bb<3;bb++){
				if(pre[i][bb]==j||pre[i][bb]==0)continue;
				for(int cc=0;cc<3;cc++){
					if(pre[j][cc]==i||pre[i][bb]==pre[j][cc]||pre[j][cc]==0)continue;
					ans=max(ans,w[i]+w[j]+w[pre[i][bb]]+w[pre[j][cc]]);
				} 
			}
		} 
	}
	cout<<ans;
	return 0;
}
2023/12/14 15:07
加载中...