{"id":333,"date":"2012-07-30T23:13:47","date_gmt":"2012-07-30T15:13:47","guid":{"rendered":"http:\/\/www.shuizilong.com\/house\/?p=333"},"modified":"2014-10-15T23:12:09","modified_gmt":"2014-10-15T15:12:09","slug":"spoj-1825-free-tour-ii","status":"publish","type":"post","link":"https:\/\/www.shuizilong.com\/house\/archives\/spoj-1825-free-tour-ii\/","title":{"rendered":"SPOJ 1825. Free tour II"},"content":{"rendered":"<h3>Brief description: <\/h3>\n<p>\u7ed9\u5b9a\u4e00\u68f5 n \u4e2a\u70b9\u7684\u70b9\u6743\u6811\uff0c\u540c\u65f6\u7ed3\u70b9\u5206\u4e3a\u9ed1\u70b9\u548c\u767d\u70b9\u4e24\u7c7b\u3002<br \/>\n\u8981\u6c42\u627e\u5230\u4e00\u6761\u957f\u5ea6\u6700\u5927\u7684\u8def\u5f84\uff0c\u4f7f\u5f97\u8def\u5f84\u4e0a\u7ecf\u8fc7\u7684\u9ed1\u70b9\u6570\u4e0d\u8d85\u8fc7 k \u4e2a\u3002<\/p>\n<p><!--more--><\/p>\n<h3>Analysis: <\/h3>\n<p>\u70b9\u5206\u6cbb + \u52a8\u6001\u89c4\u5212\uff09<br \/>\n\u3002\u3002\u3002\u6709\u5f85\u5206\u6790\u3002<\/p>\n<pre class=\"brush: cpp; collapse: true; first-line: 1; light: false; title: SPOJ 1825. Free tour II.cpp; toolbar: true; notranslate\" title=\"SPOJ 1825. Free tour II.cpp\">\r\nconst int MOD = 1000000007;\r\nconst int INF = 0x7fffffff;\r\nconst int N = 200000 + 9, M = N * 2;\r\n\r\nint a&#x5B;M], b&#x5B;M], w&#x5B;M], prd&#x5B;M], suc&#x5B;M]; \/\/ edge ..\r\nint dist&#x5B;N], max_dep&#x5B;N], dep&#x5B;N], sz&#x5B;N], hd&#x5B;N]; bool isBlack&#x5B;N]; \/\/ vertx ..\r\nint L&#x5B;N], Ln, F&#x5B;N], Fn, G&#x5B;N], Gn; \/\/ core ..\r\nint n, n_, m, k, _c, c, ans;\r\n\r\ninline void remove(int x){\r\n    if (x == hd&#x5B;a&#x5B;x]]) prd&#x5B;hd&#x5B;a&#x5B;x]] = suc&#x5B;x]] = 0;\r\n    else suc&#x5B;prd&#x5B;suc&#x5B;x]] = prd&#x5B;x]] = suc&#x5B;x];\r\n}\r\n\r\n#define v b&#x5B;i]\r\ninline void dfs1(int u, int p){\r\n    \r\n    max_dep&#x5B;u] = dep&#x5B;u];\r\n    \r\n    if (!p){\r\n        for(int i=hd&#x5B;u];i;i=suc&#x5B;i]){\r\n            remove(i^1), dist&#x5B;v] = dist&#x5B;u] + w&#x5B;i], dep&#x5B;v] = dep&#x5B;u] + isBlack&#x5B;v];\r\n            dfs1(v, u), checkMax(max_dep&#x5B;u], max_dep&#x5B;v]), L&#x5B;Ln++] = v;\r\n        }\r\n    }\r\n    else {\r\n        for(int i=hd&#x5B;u];i;i=suc&#x5B;i]) if (v != p){\r\n            dist&#x5B;v] = dist&#x5B;u] + w&#x5B;i], dep&#x5B;v] = dep&#x5B;u] + isBlack&#x5B;v];\r\n            dfs1(v, u), checkMax(max_dep&#x5B;u], max_dep&#x5B;v]);\r\n        }\r\n    }\r\n\r\n}\r\n\r\ninline void dfs2(int u, int p){\r\n    \r\n    if (dep&#x5B;u] &gt;= Gn) return;\r\n    checkMax(G&#x5B;dep&#x5B;u]], dist&#x5B;u]);\r\n    \r\n    for(int i=hd&#x5B;u];i;i=suc&#x5B;i]) if (v != p){\r\n        dfs2(v, u);\r\n    }\r\n}\r\n\r\ninline void find_center(int u, int p){\r\n    \r\n    int blc = 0; sz&#x5B;u] = 1;\r\n    \r\n    for(int i=hd&#x5B;u];i;i=suc&#x5B;i]) if (v != p){\r\n        find_center(v, u), sz&#x5B;u] += sz&#x5B;v];\r\n        checkMax(blc, sz&#x5B;v]);\r\n    }\r\n    \r\n    checkMax(blc, n_ - sz&#x5B;u]);\r\n    if (blc &lt;= _c) _c = blc, c = u;\r\n}\r\n\r\ninline bool shller(int a, int b){\r\n    return max_dep&#x5B;a] &lt; max_dep&#x5B;b];\r\n}\r\n\r\ninline void stat(bool rt){\r\n    \r\n    if (!rt || k){\r\n    \r\n        sort(L, L+Ln, shller); Fn = 1; REP(i, Ln){\r\n            \r\n            Gn = min(max_dep&#x5B;L&#x5B;i]] + 1, k + !rt), dfs2(L&#x5B;i], 0);\r\n            FOR(j, 1, Gn) checkMax(G&#x5B;j], G&#x5B;j-1]);\r\n        \r\n            FOR(j, 0, Fn) {\r\n                int t = k - j - rt;\r\n                checkMax(ans, F&#x5B;j] + (t&lt;Gn?G&#x5B;t]:G&#x5B;Gn-1]));\r\n            }\r\n            checkMax(Fn, Gn); REP(j, Fn) checkMax(F&#x5B;j], G&#x5B;j]);\r\n          \r\n            \/\/REP(i, Gn) G&#x5B;i] = 0;\r\n            fill(G, G+Gn, 0);\r\n        }\r\n    \r\n        \/\/REP(i, Fn) F&#x5B;i] = 0;\r\n        fill(F, F+Fn, 0);\r\n    }\r\n    \r\n    Ln = 0;\r\n}\r\n\r\ninline void solve(int u = 1){\r\n    \r\n    _c = INF, find_center(u, 0), u = c;    \r\n    dep&#x5B;u] = dist&#x5B;u] = 0, dfs1(u, 0), \r\n    \r\n    stat(isBlack&#x5B;u]);\r\n    \r\n    for(int i=hd&#x5B;u];i;i=suc&#x5B;i]){\r\n        n_ = sz&#x5B;v], solve(v);\r\n    }\r\n}\r\n\r\n\r\nint main(){\r\n\r\n    \/\/freopen(&quot;in.txt&quot;, &quot;r&quot;, stdin);\r\n    \/\/freopen(&quot;out.txt&quot;, &quot;w&quot;, stdout);\r\n    \/\/ios::sync_with_stdio(false);\r\n    \r\n    RD(n, k, m); DO(m) isBlack&#x5B;RD()] = true;\r\n    \r\n    for (int i=2;i&lt;n&lt;&lt;1;++i){\r\n        RD(a&#x5B;i], b&#x5B;i]); RD_S(w&#x5B;i]), a&#x5B;i|1] = b&#x5B;i], b&#x5B;i|1] = a&#x5B;i], w&#x5B;i|1] = w&#x5B;i];\r\n        prd&#x5B;hd&#x5B;a&#x5B;i]]] = i, suc&#x5B;i] = hd&#x5B;a&#x5B;i]], hd&#x5B;a&#x5B;i]] = i; ++i;\r\n        prd&#x5B;hd&#x5B;a&#x5B;i]]] = i, suc&#x5B;i] = hd&#x5B;a&#x5B;i]], hd&#x5B;a&#x5B;i]] = i;\r\n    }\r\n        \r\n    n_ = n, solve(), printf(&quot;%d\\n&quot;, ans);\r\n}\r\n<\/pre>\n<h3>External link: <\/h3>\n<p><a href=\"http:\/\/www.spoj.pl\/problems\/FTOUR2\/\">http:\/\/www.spoj.pl\/problems\/FTOUR2\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Brief description: \u7ed9\u5b9a\u4e00\u68f5 n \u4e2a\u70b9\u7684\u70b9\u6743\u6811\uff0c\u540c\u65f6\u7ed3\u70b9\u5206\u4e3a\u9ed1\u70b9\u548c\u767d\u70b9\u4e24\u7c7b\u3002 \u8981\u6c42\u627e\u5230\u4e00\u6761\u957f\u5ea6\u6700\u5927\u7684\u8def\u5f84\uff0c\u4f7f\u5f97\u8def\u5f84\u4e0a\u7ecf\u8fc7\u7684\u9ed1\u70b9\u6570\u4e0d\u8d85\u8fc7 k \u4e2a\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":[21],"tags":[],"class_list":["post-333","post","type-post","status-publish","format-standard","hentry","category-spoj"],"jetpack_publicize_connections":[],"jetpack_featured_media_url":"","jetpack_shortlink":"https:\/\/wp.me\/p2tdP7-5n","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/www.shuizilong.com\/house\/wp-json\/wp\/v2\/posts\/333","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=333"}],"version-history":[{"count":0,"href":"https:\/\/www.shuizilong.com\/house\/wp-json\/wp\/v2\/posts\/333\/revisions"}],"wp:attachment":[{"href":"https:\/\/www.shuizilong.com\/house\/wp-json\/wp\/v2\/media?parent=333"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.shuizilong.com\/house\/wp-json\/wp\/v2\/categories?post=333"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.shuizilong.com\/house\/wp-json\/wp\/v2\/tags?post=333"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}