zoukankan      html  css  js  c++  java
  • POJ 1273 Drainage Ditches

    网络流。


    题意非常easy。给出单向边,容量。

    找最大流。注意重边要加起来。g[u][v].c+=c;

    第一次写网络流。

    也是第一个网络流的题。

    看了两天,理解了之后就唰唰唰的写出来了。

    大概可能是EK吧。

    ORZ都不知道用的啥算法。仅仅是感觉要这样写。由于重边还WA了。改了就AC。


    PS:事实上网络流的教程这么多。

    个人感觉就是DFS或者BFS找增广路,然后改动流量。看懂了就不算难。

    难的是怎样建立流量图模型。

    不会每道题都想这个这么裸。


    #include<cstdio>
    #include<cstring>
    #include<string>
    #include<queue>
    #include<algorithm>
    #include<map>
    #include<stack>
    #include<iostream>
    #include<list>
    #include<set>
    #include<cmath>
    #define INF 0x7fffffff
    #define eps 1e-6
    #define LL long long
    #define acfun std::ios::sync_with_stdio(false)
    using namespace std;
    struct type
    {
        int c,f;
    };
    type g[1001][1001];
    bool vis[1001];
    int prev[1001];
    int alpha[1001];
    int n,m;
    
    void EK(int start,int thend)
    {
        int maxflow=0;
        while(1)
        {
            for(int i=0; i<=n; i++)
                vis[i]=prev[i]=alpha[i]=0;
            queue<int>q;
            q.push(start);
            vis[start]=1;
            alpha[start]=INF;
            while(!q.empty()&&!vis[thend])
            {
                int u=q.front();
                q.pop();
                for(int j=1; j<=n; j++)
                {
                    if(vis[j])continue;
                    if(g[u][j].f<g[u][j].c)
                    {
                        vis[j]=1;
                        prev[j]=u;
                        alpha[j]=min(alpha[u],g[u][j].c-g[u][j].f);
                        q.push(j);
                    }
                    else if(g[j][u].f>0)
                    {
                        vis[j]=1;
                        prev[j]=u;
                        alpha[j]=min(alpha[u],g[j][u].f);
                        q.push(j);
                    }
                }
            }
            if(vis[thend]==0||alpha[thend]==0)break;
            int k1=thend,k2=prev[thend];
            int tmp=alpha[thend];
            maxflow+=tmp;
            while(1)
            {
                if(g[k2][k1].f<g[k2][k1].c)
                    g[k2][k1].f+=tmp;
                else
                    g[k1][k2].f-=tmp;
                k1=k2;
                k2=prev[k1];
                if(k2==0)break;
            }
        }
        printf("%d
    ",maxflow);
    }
    int main()
    {
        while(scanf("%d%d",&m,&n)!=EOF)
        {
            for(int i=1; i<=n; i++)
                for(int j=1; j<=n; j++)
                    g[i][j].c=g[i][j].f=0;
    
            int u,v,c;
            while(m--)
            {
                scanf("%d%d%d",&u,&v,&c);
                g[u][v].c+=c;
            }
            EK(1,n);
        }
    }
    


  • 相关阅读:
    kotlin入门
    android 组件化、插件化、热更新
    hadoop的心跳回忆
    [转] 支持向量机SVM的理解
    HDFS的block Id与generation stamp
    【Z】awk中使用shell的环境变量
    ceph相关
    华为手机C8812连不上豌豆荚等手机助手——解决方法
    【亲测】fatal error C1010: unexpected end of file while looking for precompiled head
    JOI Open 中一些没有题解的题的简要题解
  • 原文地址:https://www.cnblogs.com/clnchanpin/p/7003329.html
Copyright © 2011-2022 走看看