1WA1RE求助
查看原帖
1WA1RE求助
374733
adpitacor楼主2022/10/31 18:14

RT,WA #18 RE #20,也不知道哪里错 QwQ

#include<cstdio>
#define ll long long
#define N_ 2502
#define M_ 10005
int n,m,k;
ll pts[N_],ans;
bool rch[N_][N_];
void max_s(ll &p,ll q){
    if(q>p)p=q;
}
struct eg{
    int to,last;
}edge[M_<<1];
int head[N_],toteg;
void addeg(int p,int q){
    edge[++toteg]=(eg){q,head[p]};
    head[p]=toteg;
    edge[++toteg]=(eg){p,head[q]};
    head[q]=toteg;
}
struct node{
    int pos,step;
}que[N_];
int qf,qr;
bool vis[N_];
void bfs(int s){
    qf=qr=0;
    que[qr++]=(node){s,-1};
    for(;qf<qr;qf++){
        int u=que[qf].pos;
        int stp=que[qf].step;
        if(u^s)rch[s][u]=true;
        vis[u]=true;
        for(int i=head[u],v;i;i=edge[i].last){
            v=edge[i].to;
            if(!vis[v]&&stp<k){
                que[qr++]=(node){v,stp+1};
            }
        }
    }
    while(qr--){
        vis[que[qr].pos]=false;
    }
}
int f[N_][3];
void upd(int u,int i){
    if(f[u][2]&&pts[i]<=pts[f[u][2]])return;
    int j=2;
    if(!f[u][1]||pts[i]>=pts[f[u][1]]){
        j=1; f[u][2]=f[u][1];
    }
    if(!f[u][0]||pts[i]>=pts[f[u][0]]){
        j=0; f[u][1]=f[u][0];
    }
    f[u][j]=i;
}
int main(){
    scanf("%d%d%d",&n,&m,&k);
    for(int i=2;i<=n;i++)scanf("%lld",&pts[i]);
    for(int i=1,u,v;i<=m;i++){
        scanf("%d%d",&u,&v);
        addeg(u,v);
    }
    for(int i=1;i<=n;i++){
        bfs(i);
        /*for(int j=1;j<=n;j++){
            printf("%d ",rch[i][j]);
        }
        putchar('\n');*/
    }
    for(int i=2;i<=n;i++){
        for(int j=2;j<=n;j++){
            if(j==i)continue;
            if(rch[1][j]&&rch[j][i])upd(i,j);
            //if(rch[1][i]&&rch[r])
        }
    }
    /*for(int i=2;i<=n;i++){
        printf("%d:",i);
        for(int j=0;j<3;j++){
            if(!f[i][j])break;
            printf("(%d,%lld)",f[i][j],pts[f[i][j]]);
        }
        putchar('\n');
    }*/
    for(int u=2;u<=n;u++){
        for(int v=u+1;v<=n;v++){
            if(!rch[u][v])continue;
            for(int i=0,ui;i<3;i++){
                if(!(ui=f[u][i]))break;
                if(ui==v)continue;
                for(int j=0,vi;j<3;j++){
                    if(!(vi=f[v][j]))break;
                    //printf("1->%d->%d->%d->%d->1\n",ui,u,v,vi);
                    if(vi==u||ui==vi)continue;
                    max_s(ans,pts[ui]+pts[u]+pts[v]+pts[vi]);
                }
            }
        }
    }
    printf("%lld",ans);
    return 0;
}
2022/10/31 18:14
加载中...