• UVA


    题目:

    思路:

    直接套最大流的模板就OK了,注意一下输出的格式。

    代码:

    #include <bits/stdc++.h>
    #define inf 0x3f3f3f3f
    #define MAX 1000000000
    #define mod 1000000007
    #define FRE() freopen("in.txt","r",stdin)
    #define FRO() freopen("out.txt","w",stdout)
    using namespace std;
    typedef long long ll;
    typedef pair<int,ll> pii;
    const int maxn = 105;
    int n;
    struct Edge {
        int from,to,cap,flow;
        Edge(int from,int to,int cap,int flow):from(from),to(to),cap(cap),flow(flow) {}
    };
    
    struct Dinic {
        int n,m,s,t;
        vector<Edge> edges;
        vector<int> G[maxn];
        bool vis[maxn];
        int d[maxn];
        int cur[maxn];
        void init(){
            for(int i=0; i<maxn; i++){
                G[i].clear();
            }
            edges.clear();
        }
    
        void AddEdge(int from,int to,int cap) {
            edges.push_back(Edge(from,to,cap,0));
            edges.push_back(Edge(to,from,0,0));
            m = edges.size();
            G[from].push_back(m-2);
            G[to].push_back(m-1);
        }
        bool BFS(){
            memset(vis,0,sizeof(vis));
            queue<int>que;
            que.push(s);
            d[s] = 0;
            vis[s] = 1;
            while(!que.empty()){
                int x = que.front(); que.pop();
                for(int i=0; i<G[x].size(); i++){
                    Edge& e = edges[G[x][i]];
                    if(!vis[e.to] && e.cap>e.flow){
                        vis[e.to] = 1;
                        d[e.to] = d[x]+1;
                        que.push(e.to);
                    }
                }
            }
            return vis[t];
        }
    
        int DFS(int x,int a){
            if(x == t || a==0) return a;
            int flow = 0,f;
            for(int i=cur[x]; i<G[x].size(); i++){
                Edge&e = edges[G[x][i]];
                if(d[x]+1 == d[e.to] && (f=DFS(e.to,min(a,e.cap-e.flow)))>0){
                    e.flow += f;
                    edges[G[x][i]^1].flow -= f;
                    flow += f;
                    a -= f;
                    if(a==0) break;
                }
            }
            return flow;
        }
    
        int MaxFlow(int s,int t){
            this->s = s; this->t = t;
            int flow = 0;
            while(BFS()){
                memset(cur,0,sizeof(cur));
                flow += DFS(s,inf);
            }
            return flow;
        }
    }dic;
    
    int main(){
        int kase = 0;
        while(scanf("%d",&n) && n){
            dic.init();
            int ss,tt,cc,s,t,c;
            scanf("%d%d%d",&ss,&tt,&cc);
            for(int i=0; i<cc; i++){
                scanf("%d%d%d",&s,&t,&c);
                dic.AddEdge(s,t,c);
                dic.AddEdge(t,s,c);
            }
            int ans = dic.MaxFlow(ss,tt);
            printf("Network %d
    ",++kase);
            printf("The bandwidth is %d.
    
    ",ans);
        }
        return 0;
    }
  • 相关阅读:
    vue异步组件
    vue-awesome-swiper的使用
    自定义button组件时slot的使用
    axios拦截器的简单使用
    vue静态类名和动态类名绑定的几种方式
    快速知道所有元素的边框
    【转】CICD工具
    mocha学习(四)为项目开发一个BDD测试
    mocha学习(三)hook 机制 和 测试技巧
    mocha学习(二)mocha接口
  • 原文地址:https://www.cnblogs.com/sykline/p/10399825.html
Copyright © 2020-2023  润新知