求助莫名WA + RE
查看原帖
求助莫名WA + RE
231800
Veranda楼主2022/11/4 23:16

大致思路是二次建图

前两个样例都过了,第三个RE

#include <iostream>
#include <cstring>
#include <algorithm>
#include <cstdio>
#include <utility>
#include <queue>

using namespace std;

typedef pair<int,int> PII;
typedef long long LL;

const int N = 2510,M = 30010;

int n,m,k;
int h[N],e[M],ne[M],idx;
LL w[M];
int dist[N][N];
bool vis[N];
LL scor[N];
LL ans = -(LL(1) << 60);
priority_queue<PII,vector<PII>,greater<PII> > heap;
priority_queue<PII,vector<PII>,greater<PII> > emp;
queue<int> q;

void dij(int x){
    heap = emp;
    memset(vis,0,sizeof vis);
    dist[x][x] = 0;
    heap.push({0,x});
    
    while(!heap.empty()){
        PII t = heap.top();
        heap.pop();
        int ver = t.second,dis = t.first;
        if(vis[ver]) continue;
        vis[ver] = 1;
        for(int i = h[ver];~i;i = ne[i]){
            int j = e[i];
            if(dist[x][j] > dist[x][ver] + w[i]){
                dist[x][j] = dist[x][ver] + w[i];
                heap.push({dist[x][j],j});
            }
        }
        
    }
    
}

void add(int a,int b,int c){
    e[idx] = b,w[idx] = c,ne[idx] = h[a],h[a] = idx ++;
}

void dfs(int u,int dep,LL val){
    if(dep == 5){
        if(u == n + 1) ans = max(ans,val);
        return;
    }
    
    for(int i = h[u];~i;i = ne[i]){
        int j = e[i];
        if(!vis[j]){
            vis[j] = 1;
            dfs(j,dep + 1,val + w[i]);
            vis[j] = 0;
        }
    }
}


int main(){
	//freopen("r","holiday1.in",stdin);
	
    memset(h,-1,sizeof h);
    memset(dist,0x3f,sizeof dist);
    cin >> n >> m >> k;
    
    scor[1] = 0;
    for(int i = 2;i <= n;i ++){
        cin >> scor[i];
    }
    
    for(int i = 1;i <= m;i ++){
        int x,y;
        cin >> x >> y;
        add(x,y,1);
        add(y,x,1);
    }
    
    for(int i = 1;i <= n;i ++){
        dij(i);
    }
    /*
    for(int i = 1;i <= n;i ++){
        for(int j = 1;j <= n;j ++){
            cout << dist[i][j] << " ";
        }
        cout << endl;
    }
    */
    memset(h,-1,sizeof h);
    memset(e,0,sizeof e);
    memset(ne,0,sizeof ne);
    memset(w,0,sizeof w);
    memset(vis,0,sizeof vis);
    idx = 0;
    
    for(int i = 1;i <= n;i ++){
        for(int j = 1;j <= n;j ++){
            if(i == j) continue;
            if(dist[i][j] <= k + 1){
                //cout << i << " " << j << endl;
                add(i,j,scor[j]);
                //add(j,i,scor[i]);
            }
        }
    }
    
    for(int i = h[1];~i;i = ne[i]){
        int j = e[i];
        add(j,n + 1,0);
    }
    
    dfs(1,0,0);
    
    cout << ans;
}
2022/11/4 23:16
加载中...