zoukankan      html  css  js  c++  java
  • hdu3157有源汇上下界最小流

    题意:有源汇上下界最小流裸题,主要就是输入要用字符串的问题

    #include<bits/stdc++.h>
    #define fi first
    #define se second
    #define mp make_pair
    #define pb push_back
    #define pii pair<int,int>
    #define C 0.5772156649
    #define pi acos(-1.0)
    #define ll long long
    #define mod 1000000007
    #define ls l,m,rt<<1
    #define rs m+1,r,rt<<1|1
    
    using namespace std;
    
    const double g=10.0,eps=1e-12;
    const int N=300+10,maxn=90000+10,inf=0x3f3f3f3f;
    
    struct edge{
        int from,to,c,Next,low;
    }e[maxn<<1];
    int cnt,head[N];
    int dis[N];
    int in[N],out[N];
    void add(int u,int v,int c,int low)
    {
        out[u]+=low;
        in[v]+=low;
        e[cnt].from=u;
        e[cnt].to=v;
        e[cnt].c=c;
        e[cnt].low=low;
        e[cnt].Next=head[u];
        head[u]=cnt++;
        e[cnt].from=v;
        e[cnt].to=u;
        e[cnt].c=0;
        e[cnt].low=low;
        e[cnt].Next=head[v];
        head[v]=cnt++;
    }
    bool bfs(int s,int t)
    {
        memset(dis,-1,sizeof dis);
        dis[s]=1;
        queue<int>q;
        q.push(s);
        while(!q.empty())
        {
            int x=q.front();
            q.pop();
            if(x==t)return 1;
            for(int i=head[x];~i;i=e[i].Next)
            {
                int te=e[i].to;
                if(dis[te]==-1&&e[i].c>0)
                {
                    dis[te]=dis[x]+1;
                    q.push(te);
                }
            }
        }
        return 0;
    }
    int dfs(int x,int mx,int t)
    {
        if(x==t)return mx;
        int flow=0;
        for(int i=head[x];~i;i=e[i].Next)
        {
            int te=e[i].to,f;
            if(dis[te]==dis[x]+1&&e[i].c>0&&(f=dfs(te,min(mx-flow,e[i].c),t)))
            {
                e[i].c-=f;
                e[i^1].c+=f;
                flow+=f;
            }
        }
        if(!flow)dis[x]=-2;
        return flow;
    }
    int maxflow(int s,int t)
    {
        int ans=0,f;
        while(bfs(s,t))
        {
            while((f=dfs(s,inf,t)))ans+=f;
        }
        return ans;
    }
    void init()
    {
        cnt=0;
        memset(head,-1,sizeof head);
        memset(in,0,sizeof in);
        memset(out,0,sizeof out);
    }
    int change(string a,int s,int t)
    {
        if(a=="+")return s;
        else if(a=="-")return t;
        else
        {
            int ans=0;
            for(int i=0;i<a.size();i++)
                ans=ans*10+a[i]-'0';
            return ans;
        }
    }
    int main()
    {
        ios::sync_with_stdio(false);
        cin.tie(0);
        int n,m;
        while(cin>>n>>m)
        {
            if(!n&&!m)break;
            init();
            int s=n+m+1,t=n+m+2;
            for(int i=0;i<m;i++)
            {
                string a,b;
                int c;
                cin>>a>>b>>c;
                add(change(a,s,t),change(b,s,t),inf-c,c);
            }
            int ss=n+m+3,tt=n+m+4,sum=0;
            for(int i=1;i<=n+m+2;i++)
            {
                if(in[i]>out[i])add(ss,i,in[i]-out[i],0),sum+=in[i]-out[i];
                else add(i,tt,out[i]-in[i],0);
            }
            int flow=maxflow(ss,tt);
            add(t,s,inf,0);
            flow+=maxflow(ss,tt);
            if(flow!=sum)cout<<"impossible"<<endl;
            else cout<<e[cnt-1].c<<endl;
        }
        return 0;
    }
    /********************
    
    ********************/
    View Code
  • 相关阅读:
    golang删除数组某个元素
    golang用通道实现信号量,控制并发个数
    什么是ScaleIO中的forwards rebuild和backwards rebuild?
    SQL Server中的database checkpoint
    如何将thick provision lazy zeroed的VMDK文件转换为thick provision eager zeroed?
    LoadTestAgentResultsLateException in VS2010
    SQL Server Instance无法启动了, 因为TempDB所在的分区没有了, 怎么办?
    VMware vCenter中, 如何辩认虚机上Raw Device Mapping过了的一块物理磁盘?
    SQL Server AlwaysOn Setup Step-By-Step Guide
    TPC-E在populate测试Database时需要注意的一些事项
  • 原文地址:https://www.cnblogs.com/acjiumeng/p/7810856.html
Copyright © 2011-2022 走看看