hiho一下 第112周 Total Highway Distance (树的所有路径)

来源:互联网 发布:nginx 403 forbidden 编辑:程序博客网 时间:2024/05/03 19:40

分析:

很套路的一个树的题,经过一条边的所有路径的数目。
遍历以每个节点为根节点的子树的节点的个数即可求出路径数。
对树进行dfs,要记录父亲节点,防止方向边出现。

#include <cstdio>#include <cstring>#include <iostream>#include <algorithm>#include <vector>using namespace std;#define pr(x) cout << #x << ": " << x << "  " #define pl(x) cout << #x << ": " << x << endl;typedef long long ll;struct jibancanyang{    int n, m;    vector<pair<int, int> > G[112345];    int node[112345];    ll ans = 0;    void dfs(int cur, int far) {        node[cur] = 1;        for (int i = 0; i < int(G[cur].size()); ++i) {            pair<int, int> nxt = G[cur][i];            if (G[cur][i].first == far) continue;            dfs(nxt.first, cur);            node[cur] += node[nxt.first];        }        for (int i = 0; i < int(G[cur].size()); ++i) {            if (G[cur][i].first == far) continue;            int x = node[G[cur][i].first];            ans += ll(n - x) * x * G[cur][i].second;        }    }    void fun() {        scanf("%d%d", &n, &m);        for (int i = 0; i < n - 1; ++i) {            int x, y, t;            scanf("%d%d%d", &x, &y, &t);            G[x].push_back(pair<int, int>(y, t));            G[y].push_back(pair<int, int>(x, t));        }        dfs(1, -1);        while (m--) {            char op[10];            scanf("%s", op);            if (op[0] == 'Q') {                printf("%lld\n", ans);            } else {                int x, u, v, add, pre = 0;                scanf("%d%d%d", &u, &v, &add);                if (node[u] < node[v]) {                    x = node[u];                } else {                    x = node[v];                    swap(u, v);                }                for (int i = 0; i < int(G[u].size()); ++i) {                    if (G[u][i].first == v) {                        pre = G[u][i].second;                        G[u][i].second = add;                        break;                    }                }                ans -= ll(n - x) * x * pre;                ans += ll(n - x) * x * add;            }        }    }}ac;int main(){#ifdef LOCAL    freopen("in.txt", "r", stdin);    //freopen("out.txt", "w", stdout);#endif    ac.fun();    return 0;}
0 0