zoukankan      html  css  js  c++  java
  • 【uva11248】网络扩容

    网络流裸题。

    求完最大流之后保留残余容量信息,依次将已经加入最小割的弧变成c再跑,记录下即可。

    #include<bits/stdc++.h>
    #define N 20005
    #define inf 1000000007
    #define naive 0
    using namespace std;
    struct Edge{int u,v,f,next;}G[N<<1],E[N<<1];
    int n,m,c,head[N],tot=naive,s,t,cnt,level[N];
    struct edge{int u,v;edge(int u=0,int v=0):u(u),v(v){};}a[N];
    bool cmp(edge a,edge b){if(a.u==b.u)return a.v<b.v;return a.u<b.u;}
    inline void addedge(int u,int v,int f){
        G[tot].u=u;G[tot].v=v;G[tot].f=f;G[tot].next=head[u];head[u]=tot++;
        G[tot].u=v;G[tot].v=u;G[tot].f=0;G[tot].next=head[v];head[v]=tot++;
    }
    inline bool bfs(int s,int t){
        queue<int>q;
        memset(level,naive,sizeof(level));
        q.push(s);level[s]=1;
        while(!q.empty()){
            int u=q.front();q.pop();
            if(u==t)return 1;
            for(int i=head[u];~i;i=G[i].next){
                int v=G[i].v,f=G[i].f;
                if(f&&!level[v])q.push(v),level[v]=level[u]+1;
            }
        }
        return naive;
    }
    int dfs(int u,int maxf,int t){
        if(u==t)return maxf;int rat=0;
        for(int i=head[u];~i&&rat<maxf;i=G[i].next){
            int v=G[i].v,f=G[i].f;
            if(f&&level[v]==level[u]+1){
                f=dfs(v,min(f,maxf-rat),t);
                G[i].f-=f;G[i^1].f+=f;rat+=f;
            }
        }
        if(!rat)level[u]=inf;
        return rat;
    }
    inline int dinic(){int ans=0;while(bfs(s,t))ans+=dfs(s,inf,t);return ans;}
    inline int read(){
        int f=1,x=naive;char ch;
        do{ch=getchar();if(ch=='-')f=-1;}while(ch<'0'||ch>'9');
        do{x=x*10+ch-'0';ch=getchar();}while(ch>='0'&&ch<='9');
        return f*x;
    }
    int main(){int T=naive;
        while(scanf("%d%d%d",&n,&m,&c)&&n){
            printf("Case %d: ",++T);
            memset(head,-1,sizeof(head));tot=0;s=1;t=n+1;cnt=0;
            for(int i=1;i<=m;i++){int u=read(),v=read(),f=read();addedge(u,v,f);}
            addedge(n,t,c);
            int ans=dinic();for(int i=0;i<tot;i++)E[i]=G[i];
            if(ans==c)puts("possible");
            else{
                for(int i=0;i<tot-2;i+=2)
                if(!G[i].f){
                    for(int j=0;j<tot;j++)G[j]=E[j];
                    G[i].f=c;int tmp=dinic()+ans;if(tmp==c)a[cnt++]=edge(G[i].u,G[i].v);
                }
                if(!cnt)puts("not possible");
                else{
                    printf("possible option:");sort(a,a+cnt,cmp);
                    printf("(%d,%d)",a[0].u,a[0].v);
                    for(int i=1;i<cnt;i++)printf(",(%d,%d)",a[i].u,a[i].v);printf("
    ");
                }
            }
        }
        return 0;
    }
  • 相关阅读:
    DirectUI精髓之一 控件布局的自动缩放(弹簧特性)
    windows mobile6.5截屏工具
    实现的ATL(AtlSimpleArray)数组任意插入辅助函数
    动态库中单例一记
    ASP.NET组件设计Step by Step(4)
    Asp.net 中服务端控件事件是如何触发的
    PagesSection.EnableEventValidation 属性
    ASP.NET事件回传机制
    (服务器控件)页面框架处理回发数据的过程
    ASP.NET底层架构
  • 原文地址:https://www.cnblogs.com/zcysky/p/7068145.html
Copyright © 2011-2022 走看看