死活要T一个点
查看原帖
死活要T一个点
307542
yyyhy楼主2023/12/20 19:05

算了是O(nm)的复杂度,但是死活要T掉#46

#include <cstdio>
#include <queue>
#include <vector>
#include <algorithm>
#define int long long
#define maxn 2500

struct code {
    int t, w;
} p, Q[maxn << 1];
int l, r;
struct point {
    int w, v;
    point() { w = 0; }
} q[maxn + 10][4];
std :: vector <int> to[maxn + 10];
int n, m, k, x, y, ans, ll, vis[maxn + 10], v[maxn + 10], can[maxn + 10][maxn + 10];
signed main(void) {
    scanf("%lld %lld %lld", &n, &m, &k);
    for (int i = 2; i <= n; i++)
        scanf("%lld", v + i);
    while (m--) {
        scanf("%lld %lld", &x, &y);
        to[x].push_back(y), to[y].push_back(x);
    }
    for (int i = 1; i <= n; i++) {
        l = r = 1;
        for (int j = 1; j <= n; j++) vis[j] = 0;
        vis[i] = 1;
        for (int j = 0, maxj = to[i].size(); j < maxj; j++)
            Q[r].t = 0, Q[r].w = to[i][j], r++;
        while (l < r) {
            p = Q[l++];
            vis[p.w] = 1;
            if (p.t == k) continue;
            for (int j = 0, maxj = to[p.w].size(); j < maxj; j++)
                if (!vis[to[p.w][j]])
                    Q[r].t = p.t + 1, Q[r].w = to[p.w][j], r++;
        }
        for (int j = 1; j <= n; j++)
            if (j != i && vis[j]) can[i][j] = 1;
    }
    //for (int i = 1; i <= n; i++, putchar('\n'))
    //    for (int j = 1; j <= n; j++)
    //        printf("%lld ", can[i][j]);
    for (int i = 2; i <= n; i++)
        for (int j = 1; j <= n; j++) {
            if (!can[1][j] || !can[i][j]) continue;
            if (!q[i][1].w || v[j] > q[i][1].v) q[i][3] = q[i][2], q[i][2] = q[i][1], q[i][1].w = j, q[i][1].v = v[j];
            else if (!q[i][2].w || v[j] > q[i][2].v) q[i][3] = q[i][2], q[i][2].w = j, q[i][2].v = v[j];
            else if (!q[i][3].w || v[j] > q[i][3].v) q[i][3].w = j, q[i][3].v = v[j];
        }
    for (int i = 2; i < n; i++)
        for (int j = i + 1; j <= n; j++) 
            for (int k = 1; k < 4; k++)
                for (int h = 1; h < 4; h++)
                    if (can[i][j] && q[i][k].w && q[j][h].w && q[i][k].w != j && q[j][h].w != i && q[i][k].w != q[j][h].w) 
                        ans = std :: max(ans, v[i] + v[j] + q[i][k].v + q[j][h].v);
    printf("%lld\n", ans);
    return 0;
}
2023/12/20 19:05
加载中...