代码求调
查看原帖
代码求调
322792
Alea楼主2023/10/20 09:54

60 分,大部分是 WA。

按照环的对称性枚举。

#include <iostream>
#include <vector>
#include <cstring>
#include <queue>
#define int long long
using namespace std;
const int SIZE=2510;
int n,m,k,scor[SIZE],dis[SIZE],ans=0;
bool vis[SIZE],conn[SIZE][SIZE];
vector<int> edge[SIZE];
vector<pair<int,int>> anss[SIZE];
priority_queue<pair<int,int>> wr[SIZE];
signed main(){
    cin>>n>>m>>k;
    for(int i=2;i<=n;i++) cin>>scor[i];
    for(int i=1;i<=m;i++){
        int u,v;
        cin>>u>>v;
        edge[u].push_back(v);
        edge[v].push_back(u);
    }
    for(int i=1;i<=n;i++){
        memset(dis,0x3f,sizeof(dis));
        memset(vis,0,sizeof(vis));
        priority_queue<pair<int,int>,vector<pair<int,int>>,greater<pair<int,int>>> pq;
        dis[i]=0,pq.push(make_pair(0,i));
        while(!pq.empty()){
            int u=pq.top().second;pq.pop();
            if(vis[u]) continue;
            vis[u]=true;
            for(auto v:edge[u]){
                if(dis[v]>dis[u]+1&&dis[u]+1<=k+1){
                    dis[v]=dis[u]+1;
                    conn[u][v]=conn[v][u]=true;
                    conn[i][v]=conn[v][i]=true;
                    pq.push(make_pair(dis[v],v));
                }
            }
        }
    }
    for(int v=1;v<=n;v++){
        for(int u=1;u<=n;u++){
            if(conn[1][u]&&conn[u][v]&&u!=v&&v!=1&&u!=1){
                wr[v].push(make_pair(scor[u]+scor[v],u));
            }
        }
    }
    for(int u=1;u<=n;u++) for(int k=3;k;k--) if(!wr[u].empty()) anss[u].push_back(wr[u].top()),wr[u].pop();
    for(int v=2;v<=n;v++) for(int w=2;w<=n;w++){
        if(v!=w&&conn[v][w]&&(!anss[v].empty())&&(!anss[w].empty())){
            for(auto lk0:anss[v]) for(auto lk1:anss[w]){
                if(lk0.second!=w&&lk1.second!=v) ans=max(ans,lk0.first+lk1.first);
            }
        }
    }
    cout<<ans<<endl;
    return 0;
}
2023/10/20 09:54
加载中...