80分代码求调
查看原帖
80分代码求调
365979
85b7fe楼主2023/9/1 12:46

思路是枚举BC之后从可到达位置中选择前几个进行计算。如果只选择前3个就只有45分,有WA和TLE。如果选择前14个就有80分,只剩一个WA其余都是TLE。

#include <queue>
#include <vector>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;

const size_t maxn = 2500, maxm = 1e4;

struct Node
{
    bool toHome;
    vector<size_t> Side;
    long long val;
    void AddSide(size_t target){
        Side.push_back(target);
    }
    Node(){
        toHome = false;
        val = -1;
    }
} Map[maxn + 5];
vector<size_t> achievable[maxn + 5];

using sizePair = pair<size_t, int>;

int isVisited[maxn + 5];

inline bool cmp(const size_t &a, const size_t &b){
    return Map[a].val > Map[b].val;
}

inline void bfs(int pos, int n, int k)
{
    memset(isVisited, 0, sizeof(int) * (n + 1));
    queue<sizePair> que;
    que.push(sizePair(pos, -1));
    while (que.size()){
        // 将可以访问的压入并对当前位置记录
        auto cur = que.front();que.pop();
        isVisited[cur.first] = 1;
        for (auto next : Map[cur.first].Side){
            sizePair tmp(next, cur.second + 1);
            if (tmp.second > k)continue;
            if (isVisited[next])continue;
            que.push(tmp);
        }
        if (cur.first != pos)
            achievable[pos].push_back(cur.first);
    }
    if (pos == 1)sort(achievable[pos].begin(), achievable[pos].end());
    else sort(achievable[pos].begin(), achievable[pos].end(), cmp);
}
int main()
{
    int n, m, k;
    cin >> n >> m >> k;
    for (int i = 2; i <= n; i++)cin >> Map[i].val;
    for (int j = 0; j < m; j++)
    {
        int x, y;
        cin >> x >> y;
        Map[x].AddSide(y);
        Map[y].AddSide(x);
    }
    long long ans = 0;
    auto getVal = [&](size_t p) -> long long
    {
        return Map[p].val;
    };
    for (int i = 1; i <= n; i++)
        pre_dfs(i, n, k);
    for (auto i : achievable[1])
        Map[i].toHome = true;
    for (size_t b = 2; b <= n; b++)

    {
        for (size_t c : achievable[b])
        {
            if (c == 1)
                continue;
            for (size_t i = 0; i < 3 && i < achievable[b].size(); i++)
            {
                for (size_t j = 0; j < 3 && j < achievable[c].size(); j++)
                {
                    size_t a = achievable[b][i];
                    size_t d = achievable[c][j];
                    if (a == b || a == c || a == d)
                        continue;
                    if (d == b || d == c || a == d)
                        continue;
                    // AD连到家
                    if (!Map[a].toHome || !Map[d].toHome)
                        continue;
                    long long tmp = getVal(a) + getVal(b) + getVal(c) + getVal(d);
                    ans = max(ans, tmp);
                }
            }
        }
    }
    cout << ans;
    return 0;
}
2023/9/1 12:46
加载中...