20分 WA求助大佬
查看原帖
20分 WA求助大佬
355559
FutureThx楼主2020/11/22 12:33

RT ,可能犯了sb错误,请大佬轻喷

#include <iostream>
#include <queue>
#include <vector>
#include <cmath>
using namespace std;
#define MAX_N 200010
struct tree{
    vector<int> next;
    vector<int> nextw1;
    vector<int> nextw2;
}node[MAX_N];
int n;
int d[MAX_N],f[MAX_N][21],disw1[MAX_N][21],disw2[MAX_N][21];
int num[MAX_N],ans[MAX_N];
void bfs(int v){
    queue<int> q;
    d[v] = 1;
    q.push(v);
    int t = (int)(log(n) / log(2)) + 1;
    while(!q.empty()){
        int u = q.front();
        q.pop();
        for(int i = 0;i < node[u].next.size();i++){
            int y = node[u].next[i];
            if(d[y] != 0)continue;
            d[y] = d[u] + 1;
            f[y][0] = u;
            int w1 = node[u].nextw1[i];
            int w2 = node[u].nextw2[i];
            disw1[y][0] = w1;
            disw2[y][0] = w2;
            for(int j = 1;j <= t;j++)
                f[y][j] = f[f[y][j-1]][j-1];
            q.push(y);
        }
    }
}
int LCA(int x,int y){
    int t = (int)(log(n) / log(2)) + 1;
    if(d[x] > d[y])
        swap(x,y);
    for(int i = t;i >= 0;i--)
        if(d[f[y][i]] >= d[x])
            y = f[y][i];
    if(x == y)return x;
    for(int i = t;i >= 0;i--)
        if(f[y][i] != f[x][i])
            y = f[y][i],x = f[x][i];
    return f[x][0];
}
int dfs(int now,int fa){
    ans[now] += num[now];
    for(int i = 0;i < node[now].next.size();i++){
        int y = node[now].next[i];
        if(fa != y)
            ans[now] += dfs(y,now);
    }
    return ans[now];
} 
int main()
{
    cin >> n;
    for(int i = 1;i < n;i++){
        int u,v,w1,w2;
        cin >> u >> v >> w1 >> w2;
        node[u].next.push_back(v);
        node[u].nextw1.push_back(w1);
        node[u].nextw2.push_back(w2);
        node[v].next.push_back(u);
        node[v].nextw1.push_back(w1);
        node[v].nextw2.push_back(w2);
    }
    bfs(1);
    for(int i = 2;i <= n;i++){
        int u = i - 1,v = i;
        int z = LCA(u,v);
        num[u] += 1;
        num[v] += 1;
        num[z] -= 2;
    }
    dfs(1,-1);
    int min_ans = 0;
    for(int i = 2;i <= n;i++){
        int w1 = disw1[i][0];
        int w2 = disw2[i][0];
        int t = ans[i];
        min_ans += min(w1 * t,w2);
    }
    cout << min_ans << endl;
    return 0;
}
2020/11/22 12:33
加载中...