zoukankan      html  css  js  c++  java
  • 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;
    }
  • 相关阅读:
    自定义button
    图片拉伸
    通过偏好设置进行数据存储
    AppDelegate中的方法解析
    copy-mutableCopy
    NSNumber、NSValue、NSDate、NSObject
    iOS OC语言原生开发的IM模块--RChat
    文件缓存
    ios基础动画、关键帧动画、动画组、转场动画等
    Moya/RxSwift/ObjectMapper/Alamofire开发
  • 原文地址:https://www.cnblogs.com/sykline/p/10399825.html
Copyright © 2011-2022 走看看