zoukankan      html  css  js  c++  java
  • hdu4240 求一条流量最大的路/(此题网上百分之90以上算法是错误的)

    题意:求最大流/一条流量最大的路的流量。(此题HDU上数据水,以下俩种错误的都能过。。。。)

    思路1;每次增广的时候更新流量,保存最大的那条。  错误性:每次更新。有可能最大的那条流量是前几次已经增广过的(每次是增广多条的),使得最大的那条被分解了。网上有20%代码是这种。

    (以下的第数据2,3只是了)

    思路2:每次增广的时候,更新当前每条边的容量的最值。貌似能够,错误性:最大流量也有可能被分流击杀(数据4)。

    我的解法:既然不能偷懒(可能没有想到怎样借助增广时候来维护),就自己dfs预先搜一遍,求出最大流量就可以。

    数据:

    4
    1 6 7 0 5
    0 1 4
    1 4 4
    4 5 4
    0 2 3
    2 5 3
    0 3 3
    3 5 3


    2 6 6 0 5
    0 1 5
    1 2 5
    2 3 5
    3 4 4
    4 5 5
    0 4 2


    3 6 6 0 5
    0 1 70
    1 2 40
    2 4 40
    1 3 20
    3 4 20
    4 5 50


    4 7 8 1 5
    1 2 5
    2 3 2
    3 5 2
    2 4 3
    4 5 3
    2 6 5 
    6 7 5
    7 5 5

    答案:2.500 1.250 1.250 1.000

    #include<iostream>
    #include<queue>
    #include<cstdio>
    #include<cstring>
    #include<string>
    using namespace std;
    const int inf=0x3f3f3f3f;
    const int maxv=1002,maxe=400000;
    int nume=0;int head[maxv];int e[maxe][3];
    void inline adde(int i,int j,int c)
    {
        e[nume][0]=j;e[nume][1]=head[i];head[i]=nume;
        e[nume++][2]=c;
        e[nume][0]=i;e[nume][1]=head[j];head[j]=nume;
        e[nume++][2]=0;
    }
    int ss,tt,n,m;
    int vis[maxv];int lev[maxv];
    bool bfs()
    {
        for(int i=0;i<maxv;i++)
          vis[i]=lev[i]=0;
        queue<int>q;
        q.push(ss);
        vis[ss]=1;
        while(!q.empty())
        {
            int cur=q.front();
            q.pop();
            for(int i=head[cur];i!=-1;i=e[i][1])
            {
                int v=e[i][0];
                if(!vis[v]&&e[i][2]>0)
                {
                    lev[v]=lev[cur]+1;
                    vis[v]=1;
                    q.push(v);
                }
            }
        }
        return vis[tt];
    }
    int minmaxf=0;
    int dfs(int u,int minf)
    {
       /* if(u==tt)              //開始也用更新的方法,后来想想发现错误。。。
        {
            if(mins>minmaxf)minmaxf=mins;
        }*/
        if(u==tt||minf==0)return minf;
        int sumf=0,f;
        for(int i=head[u];i!=-1&&minf;i=e[i][1])
        {
            int v=e[i][0];
            if(lev[v]==lev[u]+1&&e[i][2]>0)
            {
                f=dfs(v,minf<e[i][2]?

    minf:e[i][2]); e[i][2]-=f;e[i^1][2]+=f; sumf+=f;minf-=f; } } if(!sumf) lev[u]=-1; return sumf; } int dinic() { int sum=0; while(bfs())sum+=dfs(ss,inf); return sum; }; void dfsget(int u,int mins) //预处理出最大的一条流量 { if(mins<minmaxf)return ; if(u==tt) { if(mins>minmaxf)minmaxf=mins; } for(int i=head[u];i!=-1;i=e[i][1]) { int v=e[i][0]; if(vis[v]==0) { vis[v]=1; dfsget(v,mins<e[i][2]?mins:e[i][2]); vis[v]=0; } } } void read_build() { int aa,bb,cc; for(int j=0;j<m;j++) { scanf("%d%d%d",&aa,&bb,&cc); adde(aa,bb,cc); } /* for(int i=0;i<=tt;i++) for(int j=head[i];j!=-1;j=e[j][1]) { printf("%d->%d:%d ",i,e[j][0],e[j][2]); }*/ } void init() { nume=0; for(int i=0;i<=maxv;i++) { vis[i]=0; head[i]=-1; } minmaxf=0; } int main() { int T; scanf("%d",&T); for(int ii=1;ii<=T;ii++) { int tx; scanf("%d%d%d%d%d",&tx,&n,&m,&ss,&tt); init(); read_build(); vis[ss]=1; dfsget(ss,inf); int ans=dinic(); double bi=ans*1.0/minmaxf; printf("%d %.3lf ",ii,bi); } return 0; }





  • 相关阅读:
    httpcontext in asp.net unit test
    initialize or clean up your unittest within .net unit test
    Load a script file in sencha, supports both asynchronous and synchronous approaches
    classes system in sencha touch
    ASP.NET MVC got 405 error on HTTP DELETE request
    how to run demo city bars using sencha architect
    sencha touch mvc
    sencha touch json store
    sencha touch jsonp
    51Nod 1344:走格子(贪心)
  • 原文地址:https://www.cnblogs.com/jzssuanfa/p/7026842.html
Copyright © 2011-2022 走看看