比赛 |
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;
}