萌新袜子求助,淀粉质重心找错85pts
查看原帖
萌新袜子求助,淀粉质重心找错85pts
762646
Piggy343288楼主2023/9/21 07:40
#include <bits/stdc++.h>
using namespace std;

const int maxN = 2e5 + 10;
int siz[maxN], maxx[maxN];
bitset<maxN> vis;
struct Edge{
    int nxt, to, weight;
}e[maxN << 1];
int head[maxN];
int cnt = 0, sum = 0, n, rt;
inline void add_edge(int u, int v, int w) {
    e[++cnt]={head[u], v, w};
    head[u] = cnt;
}
void dfs1(int u, int fa) {
    siz[u] = 1, maxx[u] = 0;
    for (int i = head[u]; i; i = e[i].nxt) {
        int v = e[i].to;
        if (v != fa && !vis[v]) {
            dfs1(v, u);
            siz[u] += siz[v];
            maxx[u] = max(maxx[u], siz[v]);
        }
    }
    if ((maxx[u] = max(maxx[u], sum - siz[u])) < maxx[rt]) {
        rt = u;
    }
}
int dist[maxN], tot;
pair<int, int> d[maxN];
int ans = 1e9, k;
void dfs2(int u, int fa, int level) {
    printf("%d %d %d\n", u, fa, level);
    if(level > ans)return;
    d[++tot] = {dist[u], level};
    for (int i = head[u]; i; i = e[i].nxt) {
        int v = e[i].to;
        if (v != fa && !vis[v] && e[i].weight <= k && (dist[v] = dist[u] + e[i].weight) <= k) {
            dfs2(v, u, level + 1);
        }
    }
}

const int inf = (int)4e4 << 4;
set<pair<int, int>> st;
set<pair<int, int>>::iterator it;
void dfs(int u, int fa) {
    st.insert({0, 0});
    vis[u] = true;
    for (int i = head[u]; i; i = e[i].nxt) {
        int v = e[i].to;
        if (v != fa && !vis[v]) {
            dist[v] = e[i].weight;
            dfs2(v, rt, 1);
            for (int idx = 1; idx <= tot; idx++) {    
                it = st.lower_bound(make_pair(k - d[idx].first, 0));
                if (it != st.end() && it->first + d[idx].first == k)
                    ans = min(ans, it->second + d[idx].second);
            }
            for (int idx = 1; idx <= tot; idx++)
                st.insert(d[idx]);
            tot = 0;
        }
    }
    st.clear();
    for (int i = head[u]; i; i = e[i].nxt) { int v = e[i].to; if (!vis[v])  dfs(v, u); }
}

int main() {
    cin >> n >> k;
    for (int i = 1, a, b, c; i < n; i++) {
        cin >> a >> b >> c;
        add_edge(a, b, c), add_edge(b, a, c);
    }
    rt = 0, maxx[rt] = inf, sum = n;
    dfs1(1, -1); dfs2(rt, -1, 1); dfs(rt, -1);
    cout << (ans == 1e9 ? -1 : ans);
    printf("%.2lf", (double(clock()) / CLOCKS_PER_SEC));
    return 0;
}

通过调试发现,应该是重心找错了。求助/kk

2023/9/21 07:40
加载中...