100pts hack全WA 求调
查看原帖
100pts hack全WA 求调
1092500
cnpdz楼主2024/10/19 17:17
#include<bits/stdc++.h>

using namespace std;

const int N=2501;
const int M=10000;

int n,m,k,ans;
int v[N];
vector<int> s[N];
bool w[N][N];
pair<int,int> dp[N][4];

void connect(){
	for(int i=1;i<=n;i++){
		queue<pair<int,int> > q;
		q.push({i,0});w[i][i]=1;
		while(!q.empty()){
			pair<int,int> a=q.front();
			q.pop();
			if(a.second<=k){
				for(int j=0;j<s[a.first].size();j++){
					if(!w[i][s[a.first][j]]){
						q.push({s[a.first][j],a.second+1});
						w[i][s[a.first][j]]=1;
					}
				}
			}
		}
		w[i][i]=0;
	}
}

int main(){
	cin>>n>>m>>k;
	for(int i=2;i<=n;i++){
		cin>>v[i];
	}
	for(int i=1;i<=m;i++){
		int x,y;cin>>x>>y;
		s[x].push_back(y);
		s[y].push_back(x);
	}
	
	connect();
	
	for(int i=2;i<=n;i++){
		int maxx=0,maxn=0,secx=0,secn=0,thrx=0,thrn=0;
		for(int j=2;j<=n;j++){
			if(!w[1][j]||!w[i][j]){
				continue;
			}
			if(v[j]>maxx){
				thrx=secx;thrn=secn;
				secx=maxx;secn=maxn;
				maxx=v[j];maxn=j;
				continue;
			}
			if(v[j]>secx){
				thrx=secx;thrn=secn;
				secx=v[j];secn=j;
				continue;
			}
			if(v[j]>thrx){
				thrx=v[j];thrn=j;
				continue;
			}
		}
		dp[i][1].first=maxx;dp[i][1].second=maxn;
		dp[i][2].first=secx;dp[i][2].second=secn;
		dp[i][3].first=thrx;dp[i][3].second=thrn;
	}
	
	for(int i=2;i<=n;i++){
		for(int j=2;j<=n;j++){
			if(dp[i][1].second&&dp[j][1].second&&w[i][j]){
				int a=v[i]+v[j],b=0;
				for(int x=1;x<=3;x++){
					for(int y=1;y<=3;y++){
						if(dp[i][x].second==0||dp[j][y].second==0) continue;
						if(dp[i][x].second==j||dp[j][y].second==i) continue;
						if(dp[i][x].second==dp[j][y].second) continue;
						if(!dp[i][x].second||!dp[j][y].second) continue;
						
						b=max(b,dp[i][x].first+dp[j][y].first);
					}
				}
				a+=b;
				ans=max(ans,a);
			}
		}
	}
	cout<<ans;
	return 0;
}
2024/10/19 17:17
加载中...