{"id":571,"date":"2012-11-18T00:23:58","date_gmt":"2012-11-17T16:23:58","guid":{"rendered":"http:\/\/www.shuizilong.com\/house\/?p=571"},"modified":"2012-11-30T22:45:06","modified_gmt":"2012-11-30T14:45:06","slug":"%e3%80%90%e7%ac%ac%e4%b8%89%e6%ac%a1-acdream-%e7%be%a4%e5%8e%9f%e5%88%9b%e7%be%a4%e8%b5%9b%e3%80%91%e8%a7%a3%e9%a2%98%e6%8a%a5%e5%91%8a%ef%bc%88%e6%8e%88%e6%9d%83%e8%bd%ac%e5%8f%91%e3%80%82","status":"publish","type":"post","link":"https:\/\/www.shuizilong.com\/house\/archives\/%e3%80%90%e7%ac%ac%e4%b8%89%e6%ac%a1-acdream-%e7%be%a4%e5%8e%9f%e5%88%9b%e7%be%a4%e8%b5%9b%e3%80%91%e8%a7%a3%e9%a2%98%e6%8a%a5%e5%91%8a%ef%bc%88%e6%8e%88%e6%9d%83%e8%bd%ac%e5%8f%91%e3%80%82\/","title":{"rendered":"\u3010\u7b2c\u4e09\u6b21 ACdream \u7fa4\u539f\u521b\u7fa4\u8d5b\u3011\u89e3\u9898\u62a5\u544a"},"content":{"rendered":"<h1>Overview: <\/h1>\n<blockquote><p>ACdream \u7fa4\u3010\u7b2c\u4e09\u6b21\u539f\u521b\u7fa4\u8d5b\u3011\u5c06\u4e8e\u301011\u670817\u65e5\u661f\u671f\u516d\u665a19\u70b9\u3011\u8fdb\u884c\u3002\u672c\u6b21\u539f\u521b\u7fa4\u8d5b\u7531[sjtu]ftiasch\uff08\u4eba\u79f0 GXX \u795e\u725b\u3001\u53c9\u59b9\uff09\u51fa\u9898\u3002\u6b22\u8fce\u5927\u5bb6\u79ef\u6781\u53c2\u4e0e\uff5e\u3010\u51a0\u519b\u3011\u548c\u3010ACdreamOJ\u7b2c10000\u6b21\u63d0\u4ea4\u3011\u7684ID\u6211\u4eec\u5c06\u4f1a\u8d60\u9001\u5c0f\u793c\u54c1\u4e00\u4efd \u3002\u3002 <a href=\"http:\/\/www.acdream.net\/contest.php?cid=1010\">\u6bd4\u8d5b\u4f20\u9001\u95e8\u3002\u3002<\/a>\u3002\u3002<\/p><\/blockquote>\n<p>\uff08\u3002\u3002\u3002\u770b\u6837\u5b50\u53c9\u5a18\u4e0d\u613f\u610f\u5728 <a href=\"http:\/\/www.ftiasch.com\/blog\/\">blog<\/a> \u91cc\u8d34\u592a\u5b66\u672f\u7684\u4e1c\u897f\u3002\u3002\u3002\u4ee5\u4e0b\u6388\u6743\u8f6c\u53d1\u3002\u3002\u3002<br \/>\n<a href='https:\/\/www.shuizilong.com\/house\/wp-content\/uploads\/2012\/11\/ac-dream-3rd.tar.gz'>ac-dream-3rd.tar \uff08\u9898\u76ee\u3001\u6807\u7a0b\u3001\u89e3\u9898\u62a5\u544a\u3001\u6d4b\u8bd5\u6570\u636e\u3002\u3002\u3002<\/a><\/p>\n<p><!--more--><\/p>\n<h1 id=\"solutions\">Official Solutions: <\/h1>\n<h2 id=\"xor\">Xor<\/h2>\n<p>\u8003\u8651\u7b2c\\(i\\)\u4e2a\u4e8c\u8fdb\u5236\u4f4d\uff0c\u56e0\u4e3a\\(n\\)\u662f\u5947\u6570\uff0c\u6240\u4ee5\\(A\\)\u4e2d\u7b2c\\(i\\)\u4f4d\\(0\\)\u548c\\(1\\)\u7684\u4e2a\u6570\u4e0d\u76f8\u7b49(\u5bf9\u4e8e\\(B\\)\u4e5f\u6210\u7acb\uff09\u3002\u4e8e\u662f\u53ef\u4ee5\u786e\u5b9a\\(x\\)\u7684\u7b2c\\(i\\)\u4f4d\uff0c\u6700\u540e\u518d\u9a8c\u8bc1\\(x\\)\u662f\u5426\u5408\u6cd5\u5373\u53ef\u3002<\/p>\n<h2 id=\"triangle\">Triangle<\/h2>\n<p>\u7531\u53c9\u79ef\u7684\u8868\u8fbe\u5f0f\uff0c\u77e5\u9053\u9762\u79ef\u53ea\u8ddf\u5750\u6807\u7684\u5947\u5076\u6027\u6709\u5173\uff0c\u679a\u4e3e\u6bcf\u4e2a\u70b9\u7684\u7c7b\u578b\u5373\u53ef\u3002<\/p>\n<h2 id=\"tranform\">Tranform<\/h2>\n<p>\u5e7f\u641c\u7684\u590d\u6742\u5ea6\u662f&#8230; \\[N(1 + \\frac{1}{2} + \\cdots + \\frac{1}{N}) = O(N \\log N)\\].<\/p>\n<h2 id=\"product\">Product<\/h2>\n<p>\\[v(A) = \\frac{\\prod_{a \\in A}(1 + a) &#8211; \\prod_{a \\in A}(1 &#8211; a)}{2}\\]<\/p>\n<h2 id=\"permanent\">Permanent<\/h2>\n<p>\u72b6\u538b\u52a8\u6001\u89c4\u5212\u3002<\/p>\n<h2 id=\"path\">Path<\/h2>\n<p>\u5982\u679c \\(x\\) \u662f\u53ef\u884c\u7684\uff0c\u90a3\u4e48 \\((x &#8211; 2)\\) \u4e5f\u662f\u53ef\u884c\u7684\uff0c\u6240\u4ee5\u53ef\u4ee5\u52a8\u6001\u89c4\u5212\u6c42\u51fa\u6700\u957f\u7684\u5947\u6570\u548c\u5076\u6570\u3002\u6ce8\u610f\u8d1f\u6570\u7684\u60c5\u51b5\u3002<\/p>\n<pre class=\"brush: cpp; light: false; title: \u53c9\u59d0\u6807\u7a0b; toolbar: true; notranslate\" title=\"\u53c9\u59d0\u6807\u7a0b\">\r\n#include &lt;cassert&gt;\r\n#include &lt;cstdio&gt;\r\n#include &lt;cstring&gt;\r\n#include &lt;algorithm&gt;\r\nusing namespace std;\r\n\r\nconst int N = 100000;\r\n\r\nint n, q, parent&#x5B;N];\r\n\r\nint find(int i) {\r\n    return parent&#x5B;i] == -1 ? i : (parent&#x5B;i] = find(parent&#x5B;i]));\r\n}\r\n\r\nint edge_count, first_edge&#x5B;N], to&#x5B;N &lt;&lt; 1], length&#x5B;N &lt;&lt; 1], next_edge&#x5B;N &lt;&lt; 1];\r\n\r\nconst int INF = 100000000;\r\n\r\nint down&#x5B;N]&#x5B;2], limit&#x5B;2];\r\n\r\nvoid add_edge(int u, int v, int w) {\r\n    to&#x5B;edge_count] = v;\r\n    length&#x5B;edge_count] = w;\r\n    next_edge&#x5B;edge_count] = first_edge&#x5B;u];\r\n    first_edge&#x5B;u] = edge_count ++;\r\n}\r\n\r\n#define UPDATE(x, a) x = max(x, a)\r\n\r\nvoid dfs(int p, int u) {\r\n    down&#x5B;u]&#x5B;0] = 0;\r\n    down&#x5B;u]&#x5B;1] = -INF;\r\n    for (int iter = first_edge&#x5B;u]; iter != -1; iter = next_edge&#x5B;iter]) {\r\n        int v = to&#x5B;iter];\r\n        int l = length&#x5B;iter];\r\n        if (v != p) {\r\n            dfs(u, v);\r\n            for (int x = 0; x &lt; 2; ++ x) {\r\n                for (int y = 0; y &lt; 2; ++ y) {\r\n                    UPDATE(limit&#x5B;x + y + l &amp; 1], down&#x5B;u]&#x5B;x] + down&#x5B;v]&#x5B;y] + l);\r\n                }\r\n            }\r\n            for (int y = 0; y &lt; 2; ++ y) {\r\n                UPDATE(down&#x5B;u]&#x5B;y + l &amp; 1], down&#x5B;v]&#x5B;y] + l);\r\n            }\r\n        }\r\n    }\r\n}\r\n\r\nint main() {\r\n    assert(scanf(&quot;%d%d&quot;, &amp;n, &amp;q) == 2);\r\n    assert(1 &lt;= n &amp;&amp; n &lt;= N);\r\n    assert(1 &lt;= q &amp;&amp; q &lt;= N);\r\n    memset(parent, -1, sizeof(parent));\r\n    edge_count = 0;\r\n    memset(first_edge, -1, sizeof(first_edge));\r\n    for (int i = 0; i &lt; n - 1; ++ i) {\r\n        int a, b, c;\r\n        assert(scanf(&quot;%d%d%d&quot;, &amp;a, &amp;b, &amp;c) == 3);\r\n        assert(1 &lt;= a &amp;&amp; a &lt;= n);\r\n        assert(1 &lt;= b &amp;&amp; b &lt;= n);\r\n        assert(1 &lt;= c &amp;&amp; c &lt;= 2);\r\n        a --;\r\n        b --;\r\n        assert(find(a) != find(b));\r\n        parent&#x5B;find(a)] = find(b);\r\n        add_edge(a, b, c);\r\n        add_edge(b, a, c);\r\n    }\r\n    limit&#x5B;0] = limit&#x5B;1] = -INF;\r\n    dfs(-1, 0);\r\n    while (q --) {\r\n        int l;\r\n        assert(scanf(&quot;%d&quot;, &amp;l) == 1);\r\n        if (l &lt; 0) {\r\n            puts(&quot;No&quot;);\r\n        } else {\r\n            int t = l % 2;\r\n            puts(l &lt;= limit&#x5B;t] ? &quot;Yes&quot; : &quot;No&quot;);\r\n        }\r\n    }\r\n    return 0;\r\n}\r\n\r\n<\/pre>\n<h2 id=\"multiplication\">Multiplication<\/h2>\n<p>\\[C[k] = (A[1] + A[2] + \\cdots + A[k]) \\cdot B[k] + (B[1] + B[2] + \\cdots + B[k]) \\cdot A[k] &#8211; A[k] \\cdot B[k]\\]<\/p>\n<h2 id=\"matching\">Matching<\/h2>\n<p>\u5229\u7528 <a href=\"http:\/\/en.wikipedia.org\/wiki\/Tutte_matrix\">Tutte matrix<\/a> \u53ef\u4ee5\u5f97\u5230\u5f88\u77ed\u7684\\(O(N^3)\\)\u7b97\u6cd5\u3002<\/p>\n<pre class=\"brush: cpp; light: false; title: \u53c9\u59d0\u6807\u7a0b\u3002\u3002\uff08Tuttle Matrix\u3002\u3002\u3002; toolbar: true; notranslate\" title=\"\u53c9\u59d0\u6807\u7a0b\u3002\u3002\uff08Tuttle Matrix\u3002\u3002\u3002\">\r\n#include &lt;cassert&gt;\r\n#include &lt;cstdio&gt;\r\n#include &lt;cstring&gt;\r\n#include &lt;algorithm&gt;\r\nusing namespace std;\r\n\r\nconst int N = 100;\r\nconst int MOD = 1000000000 + 7;\r\n\r\nint n, a&#x5B;N]&#x5B;N];\r\n\r\nint inverse(int a) {\r\n    return a == 1 ? 1 : (long long)(MOD - MOD \/ a) * inverse(MOD % a) % MOD;\r\n}\r\n\r\nint main() {\r\n    assert(scanf(&quot;%d&quot;, &amp;n) == 1);\r\n    assert(1 &lt;= n &amp;&amp; n &lt;= N);\r\n    for (int i = 0; i &lt; n; ++ i) {\r\n        for (int j = 0; j &lt; n; ++ j) {\r\n            assert(scanf(&quot;%d&quot;, &amp;a&#x5B;i]&#x5B;j]) == 1);\r\n        }\r\n    }\r\n    for (int i = 0; i &lt; n; ++ i) {\r\n        assert(a&#x5B;i]&#x5B;i] == 0);\r\n        for (int j = 0; j &lt; n; ++ j) {\r\n            assert(a&#x5B;i]&#x5B;j] == a&#x5B;j]&#x5B;i]);\r\n            assert(a&#x5B;i]&#x5B;j] == 0 || a&#x5B;i]&#x5B;j] == 1);\r\n        }\r\n    }\r\n    for (int i = 0; i &lt; n; ++ i) {\r\n        for (int j = 0; j &lt; n; ++ j) {\r\n            if (a&#x5B;i]&#x5B;j]) {\r\n                a&#x5B;i]&#x5B;j] = rand() % MOD;\r\n                a&#x5B;j]&#x5B;i] = MOD - a&#x5B;i]&#x5B;j];\r\n            }\r\n        }\r\n    }\r\n    int rank = 0;\r\n    for (int i = 0; i &lt; n; ++ i) {\r\n        int pivot = rank;\r\n        while (pivot &lt; n &amp;&amp; !a&#x5B;pivot]&#x5B;i]) {\r\n            pivot ++;\r\n        }\r\n        if (pivot &lt; n) {\r\n            for (int j = 0; j &lt; n; ++ j) {\r\n                swap(a&#x5B;rank]&#x5B;j], a&#x5B;pivot]&#x5B;j]);\r\n            }\r\n            {\r\n                int times = inverse(a&#x5B;rank]&#x5B;i]);\r\n                for (int j = 0; j &lt; n; ++ j) {\r\n                    a&#x5B;rank]&#x5B;j] = (long long)a&#x5B;rank]&#x5B;j] * times % MOD;\r\n                }\r\n                for (int k = 0; k &lt; n; ++ k) {\r\n                    if (k != rank &amp;&amp; a&#x5B;k]&#x5B;i]) {\r\n                        int times = a&#x5B;k]&#x5B;i];\r\n                        for (int j = 0; j &lt; n; ++ j) {\r\n                            (a&#x5B;k]&#x5B;j] += MOD - (long long)a&#x5B;rank]&#x5B;j] * times % MOD) %= MOD;\r\n                        }\r\n                    }\r\n                }\r\n            }\r\n            rank ++;\r\n        }\r\n    }\r\n    assert(!(rank &amp; 1));\r\n    printf(&quot;%d\\n&quot;, rank &gt;&gt; 1);\r\n    return 0;\r\n}\r\n<\/pre>\n<pre class=\"brush: cpp; light: false; title: \u5c9b\u59b9\u751f\u7ed8\u3002\u3002\uff08Edmonds Blossom-Contraction Algorithm\u3002\u3002\u3002; toolbar: true; notranslate\" title=\"\u5c9b\u59b9\u751f\u7ed8\u3002\u3002\uff08Edmonds Blossom-Contraction Algorithm\u3002\u3002\u3002\">\r\n\/* .................................................................................................................................. *\/\r\n\r\nconst int N = 369;\r\n\r\nint P&#x5B;N], F&#x5B;N], B&#x5B;N], Q&#x5B;N], head, tail;\r\nbool G&#x5B;N]&#x5B;N], InB&#x5B;N], inQ&#x5B;N]; int mark&#x5B;N], tot;\r\nint n, s, t, match;\r\n\r\n#define pre F&#x5B;P&#x5B;i]]\r\nint lca(int u, int v){\r\n    ++tot; RST(mark);\r\n    for (int i=u;i;i=pre){ i=B&#x5B;i]; mark&#x5B;i]=tot; }\r\n    for (int i=v;i;i=pre){ i=B&#x5B;i]; if (mark&#x5B;i]==tot) return i;}\r\n}\r\n\r\nvoid blossoming(int u,int v){\r\n\r\n    int z = lca(u, v); RST(InB);\r\n\r\n    for (int i=u;B&#x5B;i]!=z;i=pre){\r\n        if (B&#x5B;pre]!=z) F&#x5B;pre]=P&#x5B;i];\r\n        InB&#x5B;B&#x5B;i]]=true;\r\n        InB&#x5B;B&#x5B;P&#x5B;i]]]=true;\r\n    }\r\n    for (int i=v;B&#x5B;i]!=z;i=pre){\r\n        if (B&#x5B;pre]!=z) F&#x5B;pre]=P&#x5B;i]; \/\/\u540c\u7406\r\n        InB&#x5B;B&#x5B;i]]=true;\r\n        InB&#x5B;B&#x5B;P&#x5B;i]]]=true;\r\n    }\r\n\r\n    if (B&#x5B;u]!=z) F&#x5B;u]=v;\r\n    if (B&#x5B;v]!=z) F&#x5B;v]=u;\r\n    REP_1(i, n)\r\n      if (InB&#x5B;B&#x5B;i]]){\r\n          B&#x5B;i]=z;\r\n          if (!inQ&#x5B;i]){\r\n              Q&#x5B;tail++]=i;\r\n              inQ&#x5B;i]=true;\r\n          }\r\n      }\r\n}\r\n\r\nvoid change(){\r\n    int x,y,z=t; while (z){\r\n        y=F&#x5B;z], x=P&#x5B;y];\r\n        P&#x5B;y]=z, P&#x5B;z]=y, z=x;\r\n    }\r\n}\r\n\r\nbool bfs(){\r\n\r\n    RST(F, inQ); REP_1(i, n) B&#x5B;i] = i;\r\n    head=0; tail=1, Q&#x5B;0]=s, inQ&#x5B;s]=1;\r\n\r\n    while (head &lt; tail){\r\n        int u=Q&#x5B;head++];\r\n        REP_1(v, n) if (G&#x5B;u]&#x5B;v] &amp;&amp; B&#x5B;u]!=B&#x5B;v] &amp;&amp; P&#x5B;u]!=v){\r\n            if (s==v || P&#x5B;v] &amp;&amp; F&#x5B;P&#x5B;v]]) blossoming(u,v);\r\n            else if (!F&#x5B;v]){\r\n                F&#x5B;v] = u; if (P&#x5B;v]){\r\n                    Q&#x5B;tail++] = P&#x5B;v];\r\n                    inQ&#x5B;P&#x5B;v]] = true;\r\n                }\r\n                else{\r\n                    t = v, change();\r\n                    return true;\r\n                }\r\n            }\r\n        }\r\n    }\r\n    return false;\r\n\r\n}\r\n\r\nint EBC(){\r\n    int match = 0; RST(P); REP_1_N(s, n) if (!P&#x5B;s] &amp;&amp; bfs()) ++match;\r\n    return match;\r\n}\r\n\r\nvoid init(){\r\n    RD(n); REP_2_1(i, j, n, n) RD(G&#x5B;i]&#x5B;j]);\r\n}\r\n\r\nint main(){\r\n\r\n#ifndef ONLINE_JUDGE\r\n    freopen(&quot;in.txt&quot;, &quot;r&quot;, stdin);\r\n#endif\r\n\r\n    init(); OT(EBC());\r\n}\r\n\r\n<\/pre>\n<h2 id=\"cut\">Cut<\/h2>\n<p>\u4e00\u6761\u8fb9\u53ef\u4ee5\u5207\u5f00\uff0c\u5f53\u4e14\u4ec5\u5f53\u4e24\u8fb9\u8054\u901a\u5757\u90fd\u662f\u5076\u6570\u3002<\/p>\n<h2 id=\"component\">Component<\/h2>\n<p>\u8003\u8651\u8054\u901a\u5757\u4e0d\u5305\u62ec\u91cd\u5fc3\uff0c\u5219\u6700\u591a\u53ea\u80fd\u6709\\(\\frac{n}{2}\\)\u7684\u5927\u5c0f\u3002\u4e8e\u662f\u5c31\u7b97\u5305\u542b\u91cd\u5fc3\u7684\u8054\u901a\u5757\u7684\u6700\u5c0f\u6743\u503c\uff0c\u6709\u4e00\u4e2a\u719f\u77e5\u7684\u52a8\u6001\u89c4\u5212\u7b97\u6cd5\u53ef\u4ee5\u505a\u5230\\(O(N^2)\\)\u3002\u4e4b\u540e\u70b9\u5206\u6cbb\u5373\u53ef\u3002\u590d\u6742\u5ea6\u4ecd\u7136\u662f\\(O(N^2)\\)\u3002<\/p>\n<p>&quot;\u719f\u77e5\u7684\u52a8\u6001\u89c4\u5212\u7b97\u6cd5&quot;\u53ef\u4ee5\u53c2\u89c1\u4f55\u68ee\u7684\u96c6\u8bad\u961f\u8bba\u6587\u3002<\/p>\n<pre class=\"brush: cpp; light: false; title: \u53c9\u59d0\u6807\u7a0b; toolbar: true; notranslate\" title=\"\u53c9\u59d0\u6807\u7a0b\">\r\n#include &lt;cassert&gt;\r\n#include &lt;cstdio&gt;\r\n#include &lt;cstring&gt;\r\n#include &lt;vector&gt;\r\n#include &lt;algorithm&gt;\r\nusing namespace std;\r\n\r\nconst int N = 2000;\r\nconst int INF = 1000000000;\r\n\r\nint n, weight&#x5B;N], parent&#x5B;N], answer&#x5B;N + 1];\r\nvector &lt;int&gt; adjacent&#x5B;N];\r\n\r\nint find(int i) {\r\n    return parent&#x5B;i] == -1 ? i : find(parent&#x5B;i]);\r\n}\r\n\r\nbool mark&#x5B;N];\r\nint size&#x5B;N], max_tree&#x5B;N];\r\nvector &lt;int&gt; nodes;\r\nint minimum&#x5B;N + 1]&#x5B;N + 1];\r\n\r\n#define foreach(i, v) for (__typeof((v).begin()) i = (v).begin(); i != (v).end(); ++ i)\r\n\r\nvoid dfs(int p, int u) {\r\n    size&#x5B;u] = 1;\r\n    max_tree&#x5B;u] = 0;\r\n    nodes.push_back(u);\r\n    foreach (iter, adjacent&#x5B;u]) {\r\n        int v = *iter;\r\n        if (v != p &amp;&amp; !mark&#x5B;v]) {\r\n            dfs(u, v);\r\n            size&#x5B;u] += size&#x5B;v];\r\n            max_tree&#x5B;u] = max(max_tree&#x5B;u], size&#x5B;v]);\r\n        }\r\n    }\r\n}\r\n\r\nvoid divide(int root) {\r\n    nodes.clear();\r\n    dfs(-1, root);\r\n    int total = size&#x5B;root];\r\n    int new_root = -1;\r\n    int min_cost = INF;\r\n    foreach (iter, nodes) {\r\n        int u = *iter;\r\n        int ret = max(total - size&#x5B;u], max_tree&#x5B;u]);\r\n        if (ret &lt; min_cost) {\r\n            new_root = u;\r\n            min_cost = ret;\r\n        }\r\n    }\r\n    nodes.clear();\r\n    dfs(-1, new_root);\r\n    int m = nodes.size();\r\n    minimum&#x5B;m]&#x5B;0] = 0;\r\n    for (int i = 1; i &lt;= m; ++ i) {\r\n        minimum&#x5B;m]&#x5B;i] = INF;\r\n    }\r\n    for (int i = m - 1; i &gt;= 0; -- i) {\r\n        int id = nodes&#x5B;i];\r\n        for (int j = 0; j &lt;= m; ++ j) {\r\n            minimum&#x5B;i]&#x5B;j] = minimum&#x5B;i + size&#x5B;id]]&#x5B;j];\r\n            if (j) {\r\n                minimum&#x5B;i]&#x5B;j] = min(minimum&#x5B;i]&#x5B;j], minimum&#x5B;i + 1]&#x5B;j - 1] + weight&#x5B;id]);\r\n            }\r\n        }\r\n    }\r\n    for (int j = 1; j &lt;= m; ++ j) {\r\n        answer&#x5B;j] = min(answer&#x5B;j], minimum&#x5B;1]&#x5B;j - 1] + weight&#x5B;new_root]);\r\n    }\r\n    mark&#x5B;new_root] = true;\r\n    foreach (iter, adjacent&#x5B;new_root]) {\r\n        int v = *iter;\r\n        if (!mark&#x5B;v]) {\r\n            divide(v);\r\n        }\r\n    }\r\n}\r\n\r\nint main() {\r\n    assert(scanf(&quot;%d&quot;, &amp;n) == 1);\r\n    assert(1 &lt;= n &amp;&amp; n &lt;= N);\r\n    for (int i = 0; i &lt; n; ++ i) {\r\n        assert(scanf(&quot;%d&quot;, weight + i) == 1);\r\n        assert(1 &lt;= weight&#x5B;i] &amp;&amp; weight&#x5B;i] &lt;= 1000000);\r\n    }\r\n    memset(parent, -1, sizeof(parent));\r\n    for (int i = 0; i &lt; n - 1; ++ i) {\r\n        int a, b;\r\n        assert(scanf(&quot;%d%d&quot;, &amp;a, &amp;b) == 2);\r\n        a --;\r\n        b --;\r\n        adjacent&#x5B;a].push_back(b);\r\n        adjacent&#x5B;b].push_back(a);\r\n        assert(find(a) != find(b));\r\n        parent&#x5B;find(a)] = find(b);\r\n    }\r\n    for (int i = 1; i &lt;= n; ++ i) {\r\n        answer&#x5B;i] = INF;\r\n    }\r\n    memset(mark, 0, sizeof(mark));\r\n    divide(0);\r\n    for (int i = 1; i &lt;= n; ++ i) {\r\n        printf(&quot;%d%c&quot;, answer&#x5B;i], i == n ? '\\n' : ' ' );\r\n    }\r\n    return 0;\r\n}\r\n<\/pre>\n<pre class=\"brush: cpp; light: false; title: \u5c9b\u59b9\u73b0\u573a\u751f\u4ee3\u7801\u3002\u3002\uff08\u6811\u4e0a\u80cc\u5305\u3002\u3002; toolbar: true; notranslate\" title=\"\u5c9b\u59b9\u73b0\u573a\u751f\u4ee3\u7801\u3002\u3002\uff08\u6811\u4e0a\u80cc\u5305\u3002\u3002\">\r\n\/* .................................................................................................................................. *\/\r\n\r\nconst int N = 3009;\r\n\r\nint A&#x5B;N], f&#x5B;N], dp&#x5B;N]&#x5B;N];\r\nVI adj&#x5B;N]; bool vis&#x5B;N]; int sz&#x5B;N];\r\nint n, res;\r\n\r\n#define v adj&#x5B;u]&#x5B;i]\r\nvoid dfs(int u){\r\n    vis&#x5B;u] = true, sz&#x5B;u] = 1;\r\n    FLC(dp&#x5B;u], 0x3f), dp&#x5B;u]&#x5B;1] = A&#x5B;u];\r\n\r\n    REP(i, SZ(adj&#x5B;u])) if (!vis&#x5B;v]){\r\n        dfs(v), sz&#x5B;u] += sz&#x5B;v];\r\n        DWN_1(j, sz&#x5B;u], 2) DWN_1(k, min(sz&#x5B;v], j-1), 1) \/\/ \u526a\u679d .. .\r\n            checkMin(dp&#x5B;u]&#x5B;j], dp&#x5B;u]&#x5B;j-k] + dp&#x5B;v]&#x5B;k]);\r\n    }\r\n    REP_1(i, sz&#x5B;u]) checkMin(f&#x5B;i], dp&#x5B;u]&#x5B;i]);\r\n}\r\n\r\nint main(){\r\n\r\n#ifndef ONLINE_JUDGE\r\n    freopen(&quot;in.txt&quot;, &quot;r&quot;, stdin);\r\n#endif\r\n\r\n    REP_1_C(i, RD(n)) RD(A&#x5B;i]);\r\n\r\n    FLC(f, 0x3f); DO(n-1){\r\n        int x, y; RD(x, y);\r\n        adj&#x5B;x].PB(y), adj&#x5B;y].PB(x);\r\n    }\r\n\r\n    dfs(1); REP_1(i, n-1) OT(f&#x5B;i]);\r\n    cout &lt;&lt; f&#x5B;n] &lt;&lt; endl;\r\n}\r\n<\/pre>\n","protected":false},"excerpt":{"rendered":"<p>Overview: ACdream \u7fa4\u3010\u7b2c\u4e09\u6b21\u539f\u521b\u7fa4\u8d5b\u3011\u5c06\u4e8e\u301011\u670817\u65e5\u661f\u671f\u516d\u665a19\u70b9\u3011\u8fdb\u884c\u3002\u672c\u6b21\u539f\u521b\u7fa4\u8d5b\u7531[sjtu]ftiasch\uff08\u4eba\u79f0 GXX \u795e\u725b\u3001\u53c9\u59b9\uff09\u51fa\u9898\u3002\u6b22\u8fce\u5927\u5bb6\u79ef\u6781\u53c2\u4e0e\uff5e\u3010\u51a0\u519b\u3011\u548c\u3010ACdreamOJ\u7b2c10000\u6b21\u63d0\u4ea4\u3011\u7684ID\u6211\u4eec\u5c06\u4f1a\u8d60\u9001\u5c0f\u793c\u54c1\u4e00\u4efd \u3002\u3002 \u6bd4\u8d5b\u4f20\u9001\u95e8\u3002\u3002\u3002\u3002 \uff08\u3002\u3002\u3002\u770b\u6837\u5b50\u53c9\u5a18\u4e0d\u613f\u610f\u5728 blog \u91cc\u8d34\u592a\u5b66\u672f\u7684\u4e1c\u897f\u3002\u3002\u3002\u4ee5\u4e0b\u6388\u6743\u8f6c\u53d1\u3002\u3002\u3002 ac-dream-3rd.tar \uff08\u9898\u76ee\u3001\u6807\u7a0b\u3001\u89e3\u9898\u62a5\u544a\u3001\u6d4b\u8bd5\u6570\u636e\u3002\u3002\u3002<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"jetpack_post_was_ever_published":false,"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_publicize_message":"","jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":false,"jetpack_social_options":{"image_generator_settings":{"template":"highway","enabled":false}}},"categories":[96],"tags":[],"class_list":["post-571","post","type-post","status-publish","format-standard","hentry","category-acdream"],"jetpack_publicize_connections":[],"jetpack_featured_media_url":"","jetpack_shortlink":"https:\/\/wp.me\/p2tdP7-9d","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/www.shuizilong.com\/house\/wp-json\/wp\/v2\/posts\/571","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.shuizilong.com\/house\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.shuizilong.com\/house\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.shuizilong.com\/house\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.shuizilong.com\/house\/wp-json\/wp\/v2\/comments?post=571"}],"version-history":[{"count":1,"href":"https:\/\/www.shuizilong.com\/house\/wp-json\/wp\/v2\/posts\/571\/revisions"}],"predecessor-version":[{"id":572,"href":"https:\/\/www.shuizilong.com\/house\/wp-json\/wp\/v2\/posts\/571\/revisions\/572"}],"wp:attachment":[{"href":"https:\/\/www.shuizilong.com\/house\/wp-json\/wp\/v2\/media?parent=571"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.shuizilong.com\/house\/wp-json\/wp\/v2\/categories?post=571"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.shuizilong.com\/house\/wp-json\/wp\/v2\/tags?post=571"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}