zoukankan      html  css  js  c++  java
  • 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;
    }
  • 相关阅读:
    微信小游戏5.2.2 在子项目中使用EUI制作排行榜报错 wx.getFileSystemManager not function
    Egret5.2.2 微信小游戏行的示例排行榜
    Python翻译
    Python-docx库的使用
    用百度文字识别实现图片文本识别
    基于airtest的朋友圈自动点赞
    使用豆瓣源安装python包
    Appium 环境配置遇到的坑
    使用Pyppeteer进行gmail模拟登录
    异步爬虫
  • 原文地址:https://www.cnblogs.com/jerryRey/p/4851357.html
Copyright © 2011-2022 走看看