zoukankan      html  css  js  c++  java
  • P1345 [USACO5.4]奶牛的电信Telecowmunication

    #include<iostream>
    #include<cstring>
    #include<cstdio>
    #define N 1000005
    #define inf 0x3f3f3f3f
    using namespace std;
    
    struct node{
        int to,nxt,cap;
    };
    
    int que[N];
    int h,qt;
    
    struct Dinic{
        int n,m;
        int s,t;
        int tot;
        int d[N];
        int cur[N];
        node e[N];
        int vis[N];
        int head[N];
        Dinic(){tot=1;}
        void add(int f,int t,int c){
            e[++tot].to=t;
            e[tot].nxt=head[f];
            e[tot].cap=c;
            head[f]=tot;
            e[++tot].to=f;
            e[tot].nxt=head[t];
            e[tot].cap=0;
            head[t]=tot;
        }
        bool bfs(){
            memset(vis,false,sizeof(vis));
            for(int i=0;i<=n;++i)cur[i]=head[i];
            que[qt=1]=s,h=0;int top,to;d[s]=0;vis[s]=1;
            while(h<qt){
                top=que[++h];
                for(int i=head[top];i;i=e[i].nxt)
                    if(!vis[e[i].to]&&e[i].cap){
                        to=e[i].to;que[++qt]=to;
                        vis[to]=true;d[to]=d[top]+1;
                        if(to==t)return true;
                    }
            }
            return vis[t];
        }
        int dfs(int x,int fl){
            if(x==t)return fl;
            int flow=0,f;
            for(int i=cur[x];i;i=e[i].nxt)
                if(d[e[i].to]==d[x]+1)
                    if(f=dfs(e[i].to,min(fl,e[i].cap))){
                        e[i].cap-=f;
                        e[i^1].cap+=f;
                        flow+=f;fl-=f;
                        if(fl<=0)break;
                    }
            if(fl)d[x]=-1;
            return flow;
        }
        int dinic(int s,int t){
            this->s=s;
            this->t=t;
            int ans=0;
            while(bfs())
                ans+=dfs(s,inf);
            return ans;
        }
    };
    
    int n,m,s,t;
    
    int main(){
        Dinic f;
        cin>>n>>m>>s>>t;f.n=3*n;
        for(int i=1;i<=m;i++){
            int a,b;
            cin>>a>>b;
            f.add(a+n,b,inf);f.add(b,a+n,0);
            f.add(b+n,a,inf);f.add(a,b+n,0);
        }
        for(int i=1;i<=n;i++) 
            f.add(i,i+n,1),f.add(i+n,i,0);
        cout<<f.dinic(s+n,t)<<endl;
        return 0;
    }
    
  • 相关阅读:
    Java上等价类划分测试的实现
    软件测试の因果图法的测试运用
    display: block; 和 display: inline; 的区别
    CSS实现垂直居中
    CSS中实现水平居中
    HTTP头部信息
    HTTP PUT方法和POST方法的区别
    理解 ajax xhr jsonp
    深入理解JavaScript系列
    Angular 1.x 指令笔记
  • 原文地址:https://www.cnblogs.com/qdscwyy/p/8093267.html
Copyright © 2011-2022 走看看