zoukankan      html  css  js  c++  java
  • poj 3281 最大流建图

    题目链接:http://poj.org/problem?id=3281

    #include <cstdio>
    #include <cmath>
    #include <algorithm>
    #include <iostream>
    #include <cstring>
    #include <queue>
    #include <vector>
    
    #define maxn 105
    #define maxe 20000
    using namespace std;
    
    const int INF = 0x3f3f3f;
    
    struct Edge{
        int u,v,flow,cap;
        int next;
        Edge(int u=0,int v=0,int flow=0,int cap=0,int next=0):
             u(u),v(v),flow(flow),cap(cap),next(next) { }
    };
    
    
    struct Dinic{
        int s,t;
        int d[maxn];
        int cur[maxn];
        bool vis[maxn];
        Edge edges[maxe];
        int head[maxn],cnt;
    
        void init(){
            memset(head,-1,sizeof(head));
            cnt = 0;
        }
    
        void addedge(int u,int v,int cap){
            edges[cnt] = Edge(u,v,0,cap,head[u]);
            head[u] = cnt++;
            edges[cnt] = Edge(v,u,0,0,head[v]);
            head[v] = cnt++;
        }
    
        bool bfs(){
            memset(vis,0,sizeof(vis));
            queue<int> Q;
            Q.push(s);
            vis[s] = true;
            d[s] = 0;
            while(!Q.empty()){
                int u = Q.front();  Q.pop();
                for(int i=head[u];i!=-1;i=edges[i].next){
                    Edge& e = edges[i];
                    if(!vis[e.v] && e.cap > e.flow){
                        vis[e.v] = true;
                        d[e.v] = d[e.u] + 1;
                        Q.push(e.v);
                    }
                }
            }
            return vis[t];
        }
    
        int dfs(int u,int res){
            if(u == t || res == 0)  return  res;  //res 残流大小;
            int flow = 0,f;
            for(int& i=cur[u];i!=-1;i=edges[i].next){
                Edge& e = edges[i];
                if(d[e.v] == d[e.u] + 1 && (f = dfs(e.v,min(res,e.cap-e.flow))) > 0){
                    e.flow += f;
                    edges[i^1].flow -= f;
                    flow += f;
                    res -= f;
                    if(res == 0)  break;
                }
            }
            return flow;
        }
    
        int MaxFlow(int s_,int t_){
            s = s_;    t = t_;
            int flow  = 0;
            while(bfs()){
                for(int i=s;i<=t;i++)  cur[i] = head[i];
                flow += dfs(s,INF);
            }
            return flow;
        }
    }solver;
    
    int main()
    {
        //freopen("E:\acm\input.txt","r",stdin);
        solver.init();
        int N,F,D;
        cin>>N>>F>>D;
        int s = 0, t = F+2*N+D+1;
        for(int i=1;i<=F;i++)  solver.addedge(s,i,1);
        for(int i=1;i<=N;i++)  solver.addedge(F+i,F+N+i,1);
        for(int i=1;i<=D;i++)  solver.addedge(F+2*N+i,t,1);
        for(int i=1;i<=N;i++){
            int food,drink,temp;
            cin>>food>>drink;
            for(int j=1;j<=food;j++){
                cin>>temp;
                solver.addedge(temp,F+i,1);
            }
            for(int j=1;j<=drink;j++){
                cin>>temp;
                solver.addedge(F+N+i,F+2*N+temp,1);
            }
        }
        printf("%d
    ",solver.MaxFlow(s,t));
    }
    View Code
  • 相关阅读:
    Spring MVC学习03页面跳转
    Spring Boot学习07配置加载顺序
    Spring MVC学习01从空白Maven项目搭建环境
    Spring MVC学习05JSON序列化
    剑指Offer 44 数字序列中某一位的数字
    Spring MVC学习06异常解析器
    MSSQL·查看DB中所有表及列的相关信息
    MSSQL·查询数据库中所有索引的相关信息
    MSSQL·最长输出长度限制之解决方案
    .Net Core·热加载的实现及测试
  • 原文地址:https://www.cnblogs.com/acmdeweilai/p/3267331.html
Copyright © 2011-2022 走看看