飞舞求主,短小易调
查看原帖
飞舞求主,短小易调
180103
Ew_Cors楼主2022/11/13 21:09

RT,45pts,不知道哪里错了涅。

#include<bits/stdc++.h>
using namespace std;
struct edges{int v,nxt;}edge[20005];
int head[2505];
void add(int u,int v){static int cnt=0;edge[++cnt]=(edges){v,head[u]};head[u]=cnt;}
int n,m,k;
long long val[2505];
int dis1[2505];
void bfs1(){
    memset(dis1,0x3f,sizeof dis1);
    queue<int>q;
    q.push(1);dis1[1]=0;
    while(!q.empty()){
        int u=q.front();q.pop();
        if(dis1[u]>k)continue;
        for(int i=head[u];i;i=edge[i].nxt){
            if(dis1[edge[i].v]>dis1[u]+1)q.push(edge[i].v),dis1[edge[i].v]=dis1[u]+1;
        }
    }
}
vector<int>maxn[2505];
int dis[2505];
void bfs2(int xx){
    memset(dis,0x3f,sizeof dis);
    queue<int>q;
    q.push(xx);dis[xx]=0;
    while(!q.empty()){
        int u=q.front();q.pop();
        if(dis[u]>k)continue;
        if(u!=1 && u!=xx)maxn[u].push_back(xx);
        for(int i=head[u];i;i=edge[i].nxt){
            if(dis[edge[i].v]>dis[u]+1)q.push(edge[i].v),dis[edge[i].v]=dis[u]+1;
        }
    }
}
int main(){
    cin>>n>>m>>k;k++;
    for(int i=2;i<=n;i++)cin>>val[i];
    for(int i=1,u,v;i<=m;i++){
        cin>>u>>v;
        add(u,v);add(v,u);
    }
    bfs1();
    for(int i=1;i<=n;i++)if(dis1[i]<=k)bfs2(i);
    for(int i=1;i<=n;i++)
        sort(maxn[i].begin(),maxn[i].end(),[](int x,int y){return val[x]>val[y];});
//    for(int i=1;i<=n;i++,cout<<endl)
//        for(int j=0;j<maxn[i].size();j++)cout<<maxn[i][j]<<' ';
    long long ans=0;
    for(int i=2;i<=n;i++)for(int j=i+1;j<=n;j++){
        for(int kk=0;kk<=min(2,(int)(maxn[i].size())-1);kk++)
            for(int l=0;l<=min(2,(int)(maxn[j].size())-1);l++)
                if(maxn[i][kk]!=maxn[j][l] && maxn[i][kk]!=j && maxn[j][l]!=i)
                    ans=max(ans,val[i]+val[j]+val[maxn[i][kk]]+val[maxn[j][l]]);
    }
    cout<<ans;
    return 0;
}
2022/11/13 21:09
加载中...