95pts求调玄关
查看原帖
95pts求调玄关
305735
Jean_Gunnhildr楼主2024/10/24 15:36

rt,95pts

#include<bits/stdc++.h>
using namespace std;
const int N=2505;
#define for_(a) for(int i=1;i<=a;i++)
#define ll long long

int n,m,k,u,v,dis[N][N],flag[N];
//dis[i][j]表示i到j的路径长,flag是bfs里用于标记的
ll wei[N],f1[N][5],f2[N][5],ans;
//wei是每个点的分数,f1[i][k]表示能从i到达且能从起点到达的分数第k大的点的分数,f2[i][k]是这个点点的编号
bool vis[N][N];//用来去重边
vector<int> g[N]; //邻接表存边

inline void bfs(int st){
    dis[st][st]=0;
    flag[st]=st;
    queue<int> q;
    q.push(st);
    while(!q.empty()){
        int head=q.front();
        q.pop();
        for(int i:g[head]){
            if(flag[i]==st) continue;
            dis[st][i]=dis[st][head]+1;
            flag[i]=st;
            q.push(i);
        }
    }
    return ;
}

int main(){
    memset(dis,0x3f,sizeof(dis));
    scanf("%d%d%d",&n,&m,&k);
    for_(n-1) scanf("%lld",&wei[i+1]);
    for_(m){
        scanf("%d%d",&u,&v);
        if(!vis[u][v]){
            g[u].push_back(v);
            vis[u][v]=true;
        }
        if(!vis[v][u]){
            g[v].push_back(u);
            vis[v][u]=true;
        }
    }
    for_(n) bfs(i); //处理全源路径长
    for_(n){//处理f1,f2
        for(int j=2;j<=n;j++){
            if(j==i||dis[i][j]>k+1||dis[j][1]>k+1) continue;
            if(wei[j]>f1[i][1]){
                f1[i][1]=wei[j];
                f2[i][1]=j;
            }
            else if(wei[j]>f1[i][2]){
                f1[i][2]=wei[j];
                f2[i][2]=j;
            }
            else if(wei[j]>f1[i][3]){
                f1[i][3]=wei[j];
                f2[i][3]=j;
            }
        }
    }//f1 val f2 point
    for(int i=2;i<=n;i++){//枚举b点c点,根据贪心可以确定a点d点
        for(int j=2;j<=n;j++){
            if(j==i||dis[i][j]>k+1) continue;
            for(int ta=1;ta<=3;ta++){
                for(int td=1;td<=3;td++){
                    int a=f2[i][ta];
                    int d=f2[j][td];
                    if(a!=d&&a!=j&&d!=i&&a!=0&&d!=0){
                        ans=max(ans,wei[a]+wei[i]+wei[j]+wei[d]);
                    }
                }
            }
        }
    }
    printf("%lld\n",ans);
    return 0;
}
2024/10/24 15:36
加载中...