{"id":107,"date":"2010-09-14T08:24:33","date_gmt":"2010-09-14T00:24:33","guid":{"rendered":"http:\/\/www.shuizilong.com\/house\/?p=107"},"modified":"2015-09-10T23:41:35","modified_gmt":"2015-09-10T15:41:35","slug":"bzoj-1797-ahoi2009mincut-%e6%9c%80%e5%b0%8f%e5%89%b2","status":"publish","type":"post","link":"https:\/\/www.shuizilong.com\/house\/archives\/bzoj-1797-ahoi2009mincut-%e6%9c%80%e5%b0%8f%e5%89%b2\/","title":{"rendered":"BZOJ 1797. [Ahoi2009]Mincut \u6700\u5c0f\u5272"},"content":{"rendered":"<h3>Brief description :<\/h3>\n<p>\u5224\u65ad\u6d41\u7f51\u7edc\u7684\u8fb9\u96c6\uff0c\u5728\u6700\u5c0f\u5272\u4e2d\uff0c\u662f\u5426\u6709\u53ef\u80fd\u6210\u4e3a\u5272\u8fb9\u7684\uff1f\u662f\u5426\u4e00\u5b9a\u4f1a\u6210\u4e3a\u5272\u8fb9\uff1f<br \/>\n<!--more--><\/p>\n<h3>Analyse :<\/h3>\n<p>Orz hf46\u4e2d MSK \u795e\u725b\u7684\u9898\u3002\u3002\u3002<br \/>\nhttp:\/\/hi.baidu.com\/matrush\/blog\/item\/091adb03b4eedd0d728da54c.html<\/p>\n<pre lang=\"cpp\" file=\"Mincut.cpp\">\n\/*\n    Author  : xiaodao\n    Problem : AHOI 2009 Mincut \u6700\u5c0f\u5272\n    Status  : Accepted\n    Last Modify : GMT +8. Sept 14th 08:12.\n    Tags : \u7f51\u7edc\u6d41\uff0c\u6700\u5c0f\u5272\uff0c\u5f3a\u8fde\u901a\u5206\u91cf\n*\/\n#include &lt;iostream&gt;\n#include &lt;cstdio&gt;\n#include &lt;cstring&gt;\n#include &lt;vector&gt;\n#include &lt;cmath&gt;\n\nusing namespace std;\nconst int INF = 0x7fffffff;\nconst int N = 40100, M = 123001;\nstruct edge{\n    int v, c;\n    void insert(int, int);\n};\nstruct node{\n    vector&lt;int&gt; adj;\n    int D, scc;\n};\nstruct network_flow{\n    node V[N+1]; edge E[M+1];\n    int edge_count; int max_flow;\n    int n, m, s, t;\n    bool C[N+1]; int F[N+1] ,time;\n    int component;\n\n    void init();\n    void print();\n    void add_edge(int, int, int);\n    void bfs(); void dfs1(int); void dfs2(int);\n    void Dinitz();\n    void Kosaraju();\n};\ninline int _r(int x){\n    return x ^ 1;\n}\nvoid edge::insert(int a, int b){\n    v = a; c = b;\n};\nvoid network_flow::add_edge(int x, int y, int z){\n    V[x].adj.push_back(edge_count); E[edge_count++].insert(y, z);\n}\n\n\nvoid network_flow::bfs(){\n    int Q[N+1] = {s}, head = 0, tail = 1;\n    for (int i=1;i&lt;=n;i++) V[i].D = -1;\n    V[s].D = 0;\n\n    int u;\n    while (head&lt;tail){\n        u = Q[head];\n        for (size_t i=0;i&lt;V[u].adj.size();i++){\n            edge &amp;arc = E[V[u].adj[i]];\n            if (V[arc.v].D==-1 &amp;&amp; arc.c&gt;0){\n                Q[tail] = arc.v; V[arc.v].D = V[u].D + 1;\n                if (arc.v == t) return;\n                tail++;\n            }\n        }\n        head++;\n    }\n}\n\nvoid network_flow::Dinitz(){\n    max_flow = 0;\n\n    bfs();\n    while (V[t].D!=-1){\n        int stack[n+1], cur[n+1], top = 0;\n        memset(cur, 0, sizeof(cur));\n        stack[0] = M;\n\n        int u; size_t i;\n        while (top!=-1){\n            u = E[stack[top]].v;\n            if (u == t){\n                int delta = INF; int handle;\n                for (int i=1;i&lt;=top;i++){\n                    edge &amp;arc = E[stack[i]];\n                    if (arc.c &lt; delta){\n                        delta = arc.c;\n                        handle = i;\n                    }\n                }\n                max_flow += delta;\n                for (int i=1;i&lt;=top;i++){\n                    E[stack[i]].c -= delta;\n                    E[_r(stack[i])].c += delta;\n                }\n\n                \/\/for (int i=handle;i&lt;=top;i++){\n                  \/\/  cur[stack[i]] = 0;\n                \/\/}  \/\/ ?\n\n                top = handle-1;\n                continue;\n            }\n\n            for (i=cur[u];i&lt;V[u].adj.size();i++){\n                edge &amp;arc = E[V[u].adj[i]];\n                if (V[arc.v].D == V[u].D + 1 &amp;&amp; arc.c&gt;0) break;\n            }\n\n            if (i == V[u].adj.size()){\n                V[u].D = -1, top--;\n            }\n            else {\n                cur[u] = i + 1;\n                stack[++top] = V[u].adj[i];\n            }\n        }\n        bfs();\n    }\n}\n\n\n\nvoid network_flow::dfs1(int u){\n    C[u] = true;\n    for (int i=0;i&lt;V[u].adj.size();i++){\n        edge &amp;arc = E[V[u].adj[i]];\n        if (!C[arc.v] &amp;&amp; arc.c!=0)\n            dfs1(arc.v);\n    }\n    F[time++] = u;\n}\n\nvoid network_flow::dfs2(int u){\n    C[u] = true; V[u].scc = component;\n    for (int i=0;i&lt;V[u].adj.size();i++){\n        edge &amp;rev_arc = E[_r(V[u].adj[i])];\n        edge &amp;arc = E[V[u].adj[i]];\n        if (!C[arc.v] &amp;&amp; rev_arc.c!=0)\n            dfs2(arc.v);\n    }\n}\n\n\nvoid network_flow::Kosaraju(){\n    memset(C, false , sizeof(C)); time = 0;\n    for (int i=1;i&lt;=n;i++)\n        if (!C[i]) dfs1(i);\n\n    memset(C, false, sizeof(C));\n    component = 0;\n    for (int i=n-1;i&gt;=0;i--)\n        if (!C[F[i]]) dfs2(F[i]), component++;\n}\n\n\n\nvoid network_flow::init(){\n    for (int i=1;i&lt;=n;i++) V[i].adj.clear();\n    edge_count = 0; E[M].v = s;\n\n    int x, y, z;\n    for (int i=0;i&lt;m;i++){\n        scanf(&quot;%d%d%d&quot;, &amp;x, &amp;y, &amp;z);\n        add_edge(x, y, z);\n        add_edge(y, x, 0);\n    }\n}\n\nvoid network_flow::print(){\n    for (int i=0;i&lt;m;i++)\n        if (E[2*i].c !=0 || V[E[2*i+1].v].scc == V[E[2*i].v].scc) printf(&quot;0 0\\n&quot;);\n        else {\n            if (V[E[2*i+1].v].scc != V[s].scc || V[E[2*i].v].scc != V[t].scc)  printf(&quot;1 0\\n&quot;);\n            else printf(&quot;1 1\\n&quot;);\n        }\n}\n\n\nnetwork_flow G;\n\nint main(){\n    \/\/freopen(&quot;in.txt&quot;, &quot;r&quot;, stdin);\n    while (scanf(&quot;%d%d%d%d&quot;, &amp;G.n, &amp;G.m, &amp;G.s, &amp;G.t)==4){\n        G.init(); G.Dinitz(); G.Kosaraju();\n        G.print();\n    }\n}\n<\/pre>\n<p>&#8212; UPD &#8212;<br \/>\n<a href=\"https:\/\/gist.github.com\/lychees\/3a09545e29380bed4a00\">https:\/\/gist.github.com\/lychees\/3a09545e29380bed4a00<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Brief description : \u5224\u65ad\u6d41\u7f51\u7edc\u7684\u8fb9\u96c6\uff0c\u5728\u6700\u5c0f\u5272\u4e2d\uff0c\u662f\u5426\u6709\u53ef\u80fd\u6210\u4e3a\u5272\u8fb9\u7684\uff1f\u662f\u5426\u4e00\u5b9a\u4f1a\u6210\u4e3a\u5272\u8fb9\uff1f<\/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":[22],"tags":[],"class_list":["post-107","post","type-post","status-publish","format-standard","hentry","category-bzoj"],"jetpack_publicize_connections":[],"jetpack_featured_media_url":"","jetpack_shortlink":"https:\/\/wp.me\/p2tdP7-1J","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/www.shuizilong.com\/house\/wp-json\/wp\/v2\/posts\/107","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=107"}],"version-history":[{"count":1,"href":"https:\/\/www.shuizilong.com\/house\/wp-json\/wp\/v2\/posts\/107\/revisions"}],"predecessor-version":[{"id":1210,"href":"https:\/\/www.shuizilong.com\/house\/wp-json\/wp\/v2\/posts\/107\/revisions\/1210"}],"wp:attachment":[{"href":"https:\/\/www.shuizilong.com\/house\/wp-json\/wp\/v2\/media?parent=107"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.shuizilong.com\/house\/wp-json\/wp\/v2\/categories?post=107"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.shuizilong.com\/house\/wp-json\/wp\/v2\/tags?post=107"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}