85分,民间数据五彩斑斓,求大佬帮忙调一下
查看原帖
85分,民间数据五彩斑斓,求大佬帮忙调一下
685325
zhangzhihao2卷王楼主2023/8/27 15:12
#include<bits/stdc++.h>
using namespace std;
int n,m,k,w[2509],f[2509][5],vis[2509],ok[2509][2509],ans;
vector<int> to[2509];

struct Node{
    int p,l;
};

void bfs(int s){
    // cout<<s<<"**"<<endl;
    queue<Node> q;
    q.push((Node){s,0});
    while(!q.empty()){
        Node node=q.front();q.pop();
        int p=node.p,l=node.l;
        // cout<<p<<endl;
        ok[s][p]=1;
        if(ok[1][p]&&l){
            if(w[p]>=w[f[s][1]]) f[s][3]=f[s][2],f[s][2]=f[s][1],f[s][1]=p;
            else if(w[p]>=f[s][2]) f[s][3]=f[s][2],f[s][2]=p;
            else if(w[p]>=f[s][3]) f[s][3]=p;
        }
        if(l==k+1) continue;
        for(int i=0;i<to[p].size();i++){
            int v=to[p][i];
            if(ok[s][v]) continue;
            ok[s][v]=1;
            q.push((Node){v,l+1});
        }
    }
    ok[s][s]=0;
    // for(int i=1;i<=n;i++) cout<<ok[s][i]<<' ';
    // cout<<endl;
}

void bfs1(){
    queue<Node> q;
    q.push((Node){1,0});
    while(!q.empty()){
        Node node=q.front();q.pop();
        int p=node.p,l=node.l;
        // cout<<p<<' '<<l<<endl;
        if(p!=1) ok[1][p]=1;
        if(l==k+1) continue;
        for(int i=0;i<to[p].size();i++){
            int v=to[p][i];
            if(ok[1][v]) continue;
            ok[1][v]=1;
            q.push((Node){v,l+1});
        }
    }
    ok[1][1]=0;
}

int main(){
    cin>>n>>m>>k;
    for(int i=2;i<=n;i++) cin>>w[i];
    for(int i=1;i<=m;i++){
        int u,v;
        cin>>u>>v;
        to[u].push_back(v);
        to[v].push_back(u);
    }
    bfs1();
    // for(int i=1;i<=n;i++) cout<<ok[3][i]<<' ';
    // cout<<endl;
    for(int i=2;i<=n;i++) bfs(i);
    // for(int i=2;i<=n;i++) cout<<i<<' '<<f[i][1]<<' '<<f[i][2]<<' '<<f[i][3]<<endl;
    for(int b=2;b<=n;b++){
        for(int c=2;c<=n;c++)if(ok[b][c]){
            for(int i=1;i<=3;i++){
                int a=f[b][i];
                if(a==b||a==c||a==0) continue;
                for(int j=1;j<=3;j++){
                    int d=f[c][j];
                    // cout<<a<<" "<<b<<' '<<c<<' '<<d<<endl;
                    if(d==a||d==b||d==c||d==0) continue;
                    // if(w[a]+w[b]+w[c]+w[d]>ans) cout<<a<<' '<<b<<' '<<c<<" "<<d<<endl;
                    ans=max(ans,w[a]+w[b]+w[c]+w[d]);
                }
            }
        }
    }
    cout<<ans;
    return 0;
}

码风很烂:(

ok[i][j]表示从i能否走到j,f[i][1/2/3]参考了题解第一篇

就想不通哇为什么会RE

2023/8/27 15:12
加载中...