zoukankan      html  css  js  c++  java
  • bzoj 4842: [Neerc2016]Delight for a Cat【最小费用最大流】

    考试题搞了好久也没懂……
    正解应该是线性规划 https://www.cnblogs.com/CQzhangyu/p/7894559.html
    可是不会写啊
    如果从网络流的角度来体会大概是这样 http://blog.csdn.net/clover_hxy/article/details/73801094
    虽然在碰到也不一定能这么写就是了,我个辣鸡果然还是不会啊QAQ

    #include<iostream>
    #include<cstdio>
    #include<queue>
    #include<cstring>
    using namespace std;
    const int N=10005;
    const long long inf=1e18;
    int n,k,ms,me,h[N],q[N],fr[N],cnt=1,s,ss,t;
    long long ans,a[N],b[N],dis[N];
    bool v[N];
    struct qwe
    {
    	int ne,no,to,v;
    	long long c;
    }e[N<<1];
    void add(int u,int v,int w,long long c)
    {
    	cnt++;
     	e[cnt].ne=h[u];
     	e[cnt].no=u;
     	e[cnt].to=v;
     	e[cnt].c=c;
     	e[cnt].v=w;
     	h[u]=cnt;
    }
    void ins(int u,int v,int w,long long c)
    {
     	add(u,v,w,c);
     	add(v,u,0,-c);
    }
    bool spfa()
    {
    	for(int i=s;i<=t;i++)
    		dis[i]=inf;
    	queue<int>q;
    	q.push(s);
    	dis[s]=0;
    	v[s]=1;
    	while(!q.empty())
    	{
    		int u=q.front();
    		q.pop();
    		v[u]=0;
    		for(int i=h[u];i;i=e[i].ne)
    		if(e[i].v&&dis[e[i].to]>dis[u]+e[i].c)
    		{
    			fr[e[i].to]=i;
    			dis[e[i].to]=dis[u]+e[i].c;
    			if(!v[e[i].to])
    			{
    				v[e[i].to]=1;
    				q.push(e[i].to);
    			}
    		}
    	}
    	return dis[t]!=inf;
    }
    void mcf()
    {
     	int x=1e9;
     	for(int i=fr[t];i;i=fr[e[i].no])
     	x=min(x,e[i].v);
    	for(int i=fr[t];i;i=fr[e[i].no])
    	{
    		e[i].v-=x;
    		e[i^1].v+=x;
    		ans-=x*e[i].c;
    	}
    }
    int main()
    {
        scanf("%d%d%d%d",&n,&k,&ms,&me);
        for(int i=1;i<=n;i++)
        {
            scanf("%lld",&a[i]);
            ans+=a[i];
        }
        for(int i=1;i<=n;i++)
            scanf("%lld",&b[i]);
        s=0,t=n+2,ss=n+1;
    	int mn=me,mx=k-ms;
        for(int i=1;i<=n;i++)
    		ins(i,i+k>n?t:i+k,1,a[i]-b[i]);
    	for(int i=1;i<=n;i++)
    		ins(i,i+1>n?t:i+1,mx-mn,0);
    	for(int i=1;i<=k;i++)
    		ins(ss,i,1e9,0);
    	ins(s,ss,mx,0);
    	while(spfa())
    		mcf();
        printf("%lld
    ",ans);
    	for(int i=3;i<=2*n+1;i+=2)
    		if(e[i].v)
    			printf("E");
    		else
    			printf("S");
        return 0;
    }
    
  • 相关阅读:
    CGI与FastCGI
    Google Protocol Buffer 的使用和原理
    AMQP协议
    Java 多线程 并发编程
    深入理解HashMap
    Bitmap 位图
    Bloom Filter概念和原理
    BloomFilter–大规模数据处理利器
    java bitmap/bitvector的分析和应用
    Linux iptables 备忘
  • 原文地址:https://www.cnblogs.com/lokiii/p/8471001.html
Copyright © 2011-2022 走看看