{"id":185,"date":"2010-03-24T15:57:00","date_gmt":"2010-03-24T07:57:00","guid":{"rendered":"http:\/\/localhost\/?p=185"},"modified":"2010-03-24T15:57:00","modified_gmt":"2010-03-24T07:57:00","slug":"ahoi2006_school_route_route","status":"publish","type":"post","link":"https:\/\/www.shuizilong.com\/wjmzbmr\/?p=185","title":{"rendered":"[AHOI2006]\u4e0a\u5b66\u8def\u7ebfroute"},"content":{"rendered":"\n<p>\u5f88\u663e\u7136\u9996\u5148spfa\u51fa\u6700\u77ed\u8def\uff0c\u7136\u540e\u5c31\u6309\u6700\u77ed\u8def\u5efa\u56fe\uff0c\u7136\u540e\u5f88\u663e\u7136\u5c31\u6362\u6210\u4e86\u6700\u5c0f\u5272\u7684\u95ee\u9898\u4e86\u56e7\u3002\u3002\u4e0d\u8fc7\u8fd9\u91cc\u7684\u5272\u662f\u6709\u5411\u7684\uff0c\u6ce8\u610f\u4e00\u4e0b\u54e6(*^__^*) \u563b\u563b<br \/>Code:<\/p>\n<p>#include&lt;cstdio&gt;#include&lt;queue&gt;#include&lt;algorithm&gt;#include&lt;iostream&gt;using namespace std;const int maxn=500;struct Edge{    int t,c,Len;    bool e;    Edge(int _t,int _Len,int _c,Edge* _next):        t(_t),Len(_Len),next(_next),c(_c),e(false){}    Edge*next,*op;    \/*void addFlow(int _c)    {        c-=_c;        op-&gt;c+=_c;    }*\/}*E[maxn];int n,m,vs,vt;void InsEdge(int s,int t,int c,int Len){    E[s]=new Edge(t,Len,c,E[s]);    E[t]=new Edge(s,Len,c,E[t]);    E[s]-&gt;op=E[t];E[t]-&gt;op=E[s];}void Init(){    scanf(&quot;%d %d&quot;,&amp;n,&amp;m);int s,t,Len,c;    vs=0,vt=n-1;    while(m&#8211;)    {        scanf(&quot;%d %d %d %d&quot;,&amp;s,&amp;t,&amp;Len,&amp;c);        InsEdge(s-1,t-1,c,Len);    }}const int inf=~0U&gt;&gt;2;int DistToStart[maxn],DistToEnd[maxn];void Spfa(int Dist[maxn],int vs){    queue&lt;int&gt; Q;    bool inQ[maxn]={0};    for(int i=0;i&lt;n;i++) Dist[i]=inf;    Dist[vs]=0;inQ[vs]=true;Q.push(vs);    while(Q.size())    {        int t=Q.front();Q.pop();inQ[t]=false;int cost=Dist[t];        for(Edge*i=E[t];i;i=i-&gt;next)        {            int ncost=cost+i-&gt;Len;            if(ncost&lt;Dist[i-&gt;t])            {                Dist[i-&gt;t]=ncost;                if(!inQ[i-&gt;t])                    inQ[i-&gt;t]=true,Q.push(i-&gt;t);            }        }    }}void BuildGraph(){    Spfa(DistToStart,vs);    Spfa(DistToEnd,vt);    int cost=DistToStart[vt];    for(int i=0;i&lt;n;i++)        for(Edge*e=E[i];e;e=e-&gt;next)            if(DistToStart[i]+e-&gt;Len+DistToEnd[e-&gt;t]==cost)            {                e-&gt;e=true;                e-&gt;op-&gt;e=true;                e-&gt;op-&gt;c=0;            }    cout&lt;&lt;cost&lt;&lt;endl;}int h[maxn],vh[maxn],v;int aug(int no,int m){    if(no==vt) return m;    int l=m;    for(Edge*i=E[no];i;i=i-&gt;next)if(i-&gt;e&amp;&amp;i-&gt;c&amp;&amp;h[no]==h[i-&gt;t]+1)    {        int d=aug(i-&gt;t,min(l,i-&gt;c));        i-&gt;c-=d,i-&gt;op-&gt;c+=d,l-=d;        if(!l||h[vs]&gt;=v) return m-l;    }    int minh=v;    for(Edge*i=E[no];i;i=i-&gt;next)if(i-&gt;e&amp;&amp;i-&gt;c)        minh=min(minh,h[i-&gt;t]+1);    if(!&#8211;vh[h[no]]) h[vs]=v;    vh[h[no]=minh]++;    return m-l;}long long CalFlow(){    memset(h,0,sizeof(h));    memset(vh,0,sizeof(vh));    v=n;vh[0]=v;long long flow=0;    while(h[vs]&lt;v) flow+=aug(vs,inf);    return flow;}int main(){    \/\/freopen(&quot;in&quot;,&quot;r&quot;,stdin);    Init();    BuildGraph();    cout&lt;&lt;CalFlow()&lt;&lt;endl;} <\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u5f88\u663e\u7136\u9996\u5148spfa\u51fa\u6700\u77ed\u8def\uff0c\u7136\u540e\u5c31\u6309\u6700\u77ed\u8def\u5efa\u56fe\uff0c\u7136\u540e\u5f88\u663e\u7136\u5c31\u6362\u6210\u4e86\u6700\u5c0f\u5272\u7684\u95ee\u9898\u4e86\u56e7\u3002\u3002\u4e0d\u8fc7\u8fd9\u91cc\u7684\u5272\u662f\u6709\u5411\u7684\uff0c\u6ce8\u610f\u4e00\u4e0b\u54e6(*^__^*) \u563b\u563bCode: #include&lt;cstdio&gt;#include&lt;queue&gt;#include&lt;algorithm&gt;#include&lt;iostream&gt;using namespace std;const int maxn=500;struct Edge{ int t,c,Len; bool e; Edge(int _t,int _Len,int _c,Edge* _next): t(_t),Len(_Len),next(_next),c(_c),e(false){} Edge*next,*op; \/*void addFlow(int _c) { c-=_c; op-&gt;c+=_c; }*\/}*E[maxn];int n,m,vs,vt;void InsEdge(int s,int t,int c,int Len){ E[s]=new Edge(t,Len,c,E[s]); E[t]=new Edge(s,Len,c,E[t]); E[s]-&gt;op=E[t];E[t]-&gt;op=E[s];}void Init(){ scanf(&quot;%d %d&quot;,&amp;n,&amp;m);int s,t,Len,c; vs=0,vt=n-1; while(m&#8211;) { scanf(&quot;%d %d %d %d&quot;,&amp;s,&amp;t,&amp;Len,&amp;c); InsEdge(s-1,t-1,c,Len); }}const int inf=~0U&gt;&gt;2;int DistToStart[maxn],DistToEnd[maxn];void Spfa(int Dist[maxn],int [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[10],"tags":[],"jetpack_featured_media_url":"","_links":{"self":[{"href":"https:\/\/www.shuizilong.com\/wjmzbmr\/index.php?rest_route=\/wp\/v2\/posts\/185"}],"collection":[{"href":"https:\/\/www.shuizilong.com\/wjmzbmr\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.shuizilong.com\/wjmzbmr\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.shuizilong.com\/wjmzbmr\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.shuizilong.com\/wjmzbmr\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=185"}],"version-history":[{"count":0,"href":"https:\/\/www.shuizilong.com\/wjmzbmr\/index.php?rest_route=\/wp\/v2\/posts\/185\/revisions"}],"wp:attachment":[{"href":"https:\/\/www.shuizilong.com\/wjmzbmr\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=185"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.shuizilong.com\/wjmzbmr\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=185"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.shuizilong.com\/wjmzbmr\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=185"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}