• poj1273最大流初破


    第一次网络流,学了一天的DINIC算法(个人比较愚),切了这个入门题,开始的时候怎么调连
    测试都过不了,后来发现犯了一个低级错误!把判断条件放在for(;)!里面和放在for下面大大
    不同啊!里面的话,一遇到不符合立即结束了(相当于break)!而下面的可以continue!
    dinic算法,每次BFS根据残量网络作层次图,每做一次后DFS找一个增广路(我是到目标点就return,

    每次记录该增广路中的最窄边,回溯时按最窄边更新图即可)。


    #include<iostream>  //16ms 1A
    #include<vector>
    #include<cstdio>
    #include<cstring>
    #include<queue>
    using namespace std;
    const int inf=0x3f3f3f3f;
    int m,n;
    struct edge
    {
        int to,f,pre;
    };
    int mark=0;int minf=inf;             //一条增广路最窄的边
    int head[201];vector<edge>edges(403);
    int vis[201];int level[201];
    bool bfs()                         //层次图,根据残量网络记录与原点的距离(层次)
    {
        for(int i=1;i<=n;i++)
        {
            vis[i]=level[i]=0;
        }
        vis[1]=1;
        queue<int>q;q.push(1);
        while(!q.empty())
        {
            int cur=q.front();
            q.pop();
            for(int i=head[cur];i!=-1;i=edges[i].pre)
            {
               if(edges[i].f>0&&!vis[edges[i].to])  //放里面
               {
                vis[edges[i].to]=1;
                q.push(edges[i].to);
                level[edges[i].to]=level[cur]+1;
               }
            }
        }
        return vis[n];          //访问不到目标地,结束(找不到增广路)
    }
    void dfs(int cur)           //每次找一条增广路
    {
        if(cur==n||mark){mark=1;return;}
        for(int i=head[cur];i!=-1&&!mark&&minf;i=edges[i].pre)  
        {
            int v=edges[i].to;
            int temp=edges[i].f;
            if(level[v]==level[cur]+1&&temp)
            {
                int tmin=minf;
                if(minf>temp)minf=temp;
                dfs(v);
               if(mark)
               {
                edges[i].f-=minf;
                edges[i^1].f+=minf;
               }
               else               //非目的地的回溯,minf作为全局变量,要改回来。
                  minf=tmin;
            }
        }
        return ;
    }
    int main()
    {
        while(~scanf("%d%d",&m,&n))
        {
            int s,l,c;
            memset(head,-1,sizeof(head));
            for(int i=0;i<2*m;i++)
            {
                scanf("%d%d%d",&s,&l,&c);
                edges[i].to=l;
                edges[i].pre=head[s];
                head[s]=i;edges[i].f=c;
                i++;
                 edges[i].to=s;
                edges[i].pre=head[l];
                head[l]=i;edges[i].f=0;
            }
            long long maxflow=0;
            while(bfs())
            {
                mark=0;minf=inf;
                dfs(1);
                maxflow+=minf;
            }
            printf("%lld
    ",maxflow);
        }
    }


  • 相关阅读:
    邀请函|2021 云原生实战峰会,邀请您免费现场参会报名
    Game On Serverless:SAE 助力广州小迈提升微服务研发效能
    说出你和「云原生」的故事,获得年度云原生顶级盛会通行证
    巧用浏览器F12调试器定位系统前后端bug
    测试人员怎样定位bug原因
    mysql删除某个表前100条数据
    设计模式之工厂方法模式
    2021.11.19
    20211117
    JQuery插件集合
  • 原文地址:https://www.cnblogs.com/yezekun/p/3925747.html
Copyright © 2020-2023  润新知