45pts求调,悬赏3关注
查看原帖
45pts求调,悬赏3关注
538427
czy0323楼主2023/5/16 16:23
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N=2505;
int n,m,k,ans;
int dis[N][N];
int point[N];

struct posi{
	int data,idx;
	bool operator <(const posi &b) const{
		return data>b.data;
	}
	posi(int _data,int _idx){
		data=_data, idx=_idx;
	}
};

vector<posi> reach[N];
vector<int> g[N];
queue<int> q;

signed main(){
	ios::sync_with_stdio(0);
	cin.tie(0); cout.tie(0);
	cin>>n>>m>>k;
	for(int i=1;i<=n;i++)
		for(int j=1;j<=n;j++)
			dis[i][j]=1e9;
	k++;
	for(int i=2;i<=n;i++)
		cin>>point[i];
	for(int i=1;i<=m;i++){
		int u,v;
		cin>>u>>v;
		g[u].push_back(v);
		g[v].push_back(u);
	}
	for(int i=1;i<=n;i++){
		q.push(i);
		dis[i][i]=0;
		while( !q.empty() ){
			int now=q.front();
			q.pop();
			for(auto j:g[now]){
				if( dis[i][j]!=1e9 )
					continue;
				dis[i][j]=dis[i][now]+1;
				q.push(j);
			}
		}
	}
	for(int i=2;i<=n;i++)
		for(int j=2;j<=n;j++){
			if( i==j || dis[1][j]>k )
				continue;
			if( dis[i][j]<=k )
				reach[i].push_back(posi(point[j],j));
		}
	for(int i=1;i<=n;i++)
		sort(reach[i].begin(),reach[i].end());
	for(int i=2;i<=n;i++)
		for(int j=2;j<=n;j++){
			if( i==j || dis[i][j]>k || reach[i].size()==0 || reach[j].size()==0 )
				continue;
			auto fir=reach[i].begin();
			for(int k=1;k<=3;k++){
				auto fou=reach[j].begin();
				if( dis[1][fir->idx]>k || fir->idx==i || fir->idx==j );
				else{
					for(int l=1;l<=3;l++){
						if( dis[fou->idx][1]>k || fir->idx==fou->idx || fou->idx==i || fou->idx==j );
						else ans=max(ans,point[i]+point[j]+fir->data+fou->data);
						if( next(fou)!=reach[j].end() )
							fou=next(fou);
					}
				}
				if( next(fir)!=reach[i].end() )
						fir=next(fir);
			}
		}
	cout<<ans;
	return 0;
}
2023/5/16 16:23
加载中...