• Aizu 2304 Reverse Roads(无向流)


    把有向图修改成无向图,并保证每条边的流量守恒并满足有向容量(即abs(flow(u,v) - flow(v,u)) <= 1)满足限制。

    得到最大流,根据残流输出答案。

    因为最后少了' '而WA...

    #include<bits/stdc++.h>
    using namespace std;
    const int N = 301,M = N*(N-1);
    int n,m;
    int hd[N],nx[M],to[M],cap[M],ect;
    
    inline void addEdge(int u,int v,int c = 1)
    {
        nx[ect] = hd[u];
        to[ect] = v;
        cap[ect] = c;
        hd[u] = ect++;
    }
    
    int S,T;
    int vis[N],clk;
    int lv[N],q[N];
    int cur[N];
    
    bool bfs()
    {
        int l = 0,r = 0;
        clk++;
        q[r++] = S; vis[S] = clk; lv[S] = 0;
        while(l<r){
            int u = q[l++];
            for(int i = hd[u]; ~i; i = nx[i]){
                int v = to[i];
                if(vis[v] != clk && cap[i]>0 ){
                    vis[v] = clk;
                    lv[v] = lv[u]+1;
                    q[r++] = v;
                }
            }
        }
        return vis[T] == clk;
    }
    
    int aug(int u,int a)
    {
        if(u == T||!a) return a;
        int flow = 0,f;
        for(int &i = cur[u]; ~i; i = nx[i]){
            int v = to[i];
            if(lv[v] == lv[u]+1 && (f = aug(v,min(cap[i],a)))>0){
                cap[i] -= f; cap[i^1] += f;
                a -= f; flow += f;
                if(!a) break;
            }
        }
        return flow;
    }
    const int INF = 0x3f3f3f3f;
    int MaxFlow()
    {
        int flow = 0;
        while(bfs()){
            memcpy(cur,hd,sizeof(hd));
            flow += aug(S,INF);
        }
        return flow;
    }
    
    //#define LOCAL
    int main()
    {
    #ifdef LOCAL
        freopen("in.txt","r",stdin);
    #endif
        scanf("%d%d",&n,&m);
        memset(hd,-1,sizeof(hd));
        for(int i = 0; i < m; i++){
            int u,v; scanf("%d%d",&u,&v);
            addEdge(v,u);
            addEdge(u,v);
        }
        scanf("%d%d",&S,&T);
        printf("%d
    ",MaxFlow());
        vector<int> ans;
        for(int i = 0; i < m; i++){
            if(!cap[i<<1]) ans.push_back(i+1);
        }
        printf("%d
    ",(int)ans.size());
        for(auto a:ans){
            printf("%d
    ",a);
        }
        return 0;
    }
  • 相关阅读:
    docker知识集锦
    kubernetes知识集锦
    redis知识集锦
    Java多线程知识集锦
    vscode离线安装插件
    jsoncpp的简易教程
    为什么要自动化测试?
    如何选择正确的自动化测试工具
    如何选择测试自动化工具?
    测试自动化的五大挑战
  • 原文地址:https://www.cnblogs.com/jerryRey/p/4851357.html
Copyright © 2020-2023  润新知