比赛 20250527CSP-S模拟 评测结果
题目名称 假期计划 最终得分 0
用户昵称 Xuanbo 运行时间 0.000 s
代码语言 C++ 内存使用 0.00 MiB
提交时间 2025-05-27 14:58:26
显示代码纯文本
#include<bits/stdc++.h>
#define Xuanbo return 0
#define int long long
using namespace std;
const int N=2510,M=1e4+4;
struct EDGE{
	int to;
	int nxt;
	int w;
}e[M<<1];
int head[N],cnt;
int scr[N];
void add_edge(int u,int v){
	e[++cnt].to=v;
	e[cnt].nxt=head[u];
	head[u]=cnt;
}
int n,m,k;//k:每段行程最多的转车次数
struct NODE{
	int pos;
	int dis;
	bool operator<(const NODE &x)const{
		return dis>x.dis;
	}
};
priority_queue<NODE> q;
int dis[N];
bool vis[N];
bool vis2[N];
void dijkstra(int s){
	memset(dis,0x3f,sizeof(dis));
	memset(vis,0,sizeof(vis));
	dis[s]=0;
	vis[s]=true;
	q.push((NODE){s,0});
	while(!q.empty()){
		NODE node_u=q.top();
		int u=node_u.pos;
		q.pop();
		for(int i=head[u];i;i=e[i].nxt){
			int v=e[i].to;
			if(!vis[v]&&dis[v]>dis[u]+1){
				dis[v]=dis[u]+1;
				vis[v]=true;
				q.push((NODE){v,dis[v]});
			}
		}
	}
}
int ans;
void fd(){
	int A=-1,sA=INT_MIN;
	for(int i=2;i<=n;i++){
		if(dis[i]<=k&&scr[i]>sA&&!vis2[i]){
			A=i;
			sA=scr[i];
		}
	}
	vis2[A]=true;
	dijkstra(A);
	int B=-1,sB=INT_MIN;
	for(int i=2;i<=n;i++){
		if(dis[i]<=k&&scr[i]>sB&&!vis2[i]){
			B=i;
			sB=scr[i];
		}
	}
	vis2[B]=true;
	dijkstra(1);
	int D=-1,sD=INT_MIN;
	for(int i=2;i<=n;i++){
		if(dis[i]<=k&&scr[i]>sD&&!vis2[i]){
			D=i;
			sD=scr[i];
		}
	}
	vis2[D]=true;
	dijkstra(D);
	
	int C=-1,sC=INT_MIN;
	for(int i=2;i<=n;i++){
		if(dis[i]<=k&&scr[i]>sC&&!vis2[i]){
			C=i;
			sC=scr[i];
		}
	}
	vis2[C]=true;
	
//	cout<<"A:"<<A<<" "<<sA<<endl;
//	cout<<"B:"<<B<<" "<<sB<<endl;
//	cout<<"C:"<<C<<" "<<sC<<endl;
//	cout<<"D:"<<D<<" "<<sD<<endl;
	ans=sA+sB+sC+sD;
}
struct pos{
	int u;
	int u_sc;
};
queue<pos> q2;
void dfs(){
	for(int i=2;i<=n;i++){
		if(dis[i]<=k&&!vis2[i]){
			q2.push((pos){i,scr[i]});//放进队列的为可能的A
		}
	}
}
signed main(){
	freopen("csp2022_holiday.in","r",stdin);
	freopen("csp2022_holiday.out","w",stdout);
	cin>>n>>m>>k;
	k++;
	for(int i=2;i<=n;i++){
		cin>>scr[i];
	}
	for(int i=1;i<=m;i++){
		int u,v;
		cin>>u>>v;
		add_edge(u,v);
		add_edge(v,u);
	}
	
////	for(int i=1;i<=n;i++){
////		cout<<dis[i]<<" ";
////	}
//	dijkstra(1);
//	//int A=-1,sA=INT_MIN;
//	dijkstra(A);
	fd();
	cout<<ans;
	Xuanbo;
}