zoukankan      html  css  js  c++  java
  • bzoj P2045 方格取数加强版【最大费用最大流】

    今天脑子不太清醒,把数据范围看小了一直TTTTLE……
    最大费用最大流,每个格子拆成两个(x,y),(x,y)',(x,y)向(x,y)'连一条费用a[x][y]流量1的边表示选的一次,再连一条费用0流量inf的表示取走之后再从这里走,然后每个(x,y)'向(x,y+1),(x+1,y)连一条费用0流量inf的边表示转移,然后s点向(1,1),(n,n)'向t点分别连费用0流量k的边表示限制走m次

    #include<iostream>
    #include<cstdio>
    #include<queue>
    using namespace std;
    const int N=100005,inf=1e9;
    int n,m,a[55][55],h[N],cnt=1,id[55][55],tot,s,t,dis[N],fr[N],ans;
    bool v[N];
    struct qwe
    {
    	int ne,no,to,va,c;
    }e[N];
    void add(int u,int v,int w,int c)
    {
        cnt++;
        e[cnt].ne=h[u];
        e[cnt].no=u;
        e[cnt].to=v;
        e[cnt].va=w;
        e[cnt].c=c;
        h[u]=cnt;
    }
    void ins(int u,int v,int w,int c)
    {
        add(u,v,w,c);
        add(v,u,0,-c);
    }
    bool spfa()
    {
        queue<int>q;
        for(int i=s;i<=t;i++)
            dis[i]=-inf;
        dis[s]=0;
        v[s]=1;
        q.push(s);
        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].va>0&&dis[e[i].to]<dis[u]+e[i].c)
                {
                    dis[e[i].to]=dis[u]+e[i].c;
                    fr[e[i].to]=i;
                    if(!v[e[i].to])
                    {
                        v[e[i].to]=1;
                        q.push(e[i].to);
                    }
                }
        }
        return dis[t]!=-inf;
    }
    void mcf()
    {
        int x=inf;
        for(int i=fr[t];i;i=fr[e[i].no])
            x=min(x,e[i].va);
        for(int i=fr[t];i;i=fr[e[i].no])
        {
            e[i].va-=x;
            e[i^1].va+=x;
            ans+=x*e[i].c;
        }
    }
    int main()
    {
    	scanf("%d%d",&n,&m);
    	for(int i=1;i<=n;i++)
    		for(int j=1;j<=n;j++)
    			scanf("%d",&a[i][j]),id[i][j]=++tot;
    	s=0,t=2*n*n+1;
    	ins(s,id[1][1],m,0);
    	ins(id[n][n]+n*n,t,m,0);
    	for(int i=1;i<=n;i++)
    		for(int j=1;j<=n;j++)
    		{
    			ins(id[i][j],id[i][j]+n*n,1,a[i][j]);
    			ins(id[i][j],id[i][j]+n*n,inf,0);
    			if(i<n)
    				ins(id[i][j]+n*n,id[i+1][j],inf,0);
    			if(j<n)
    				ins(id[i][j]+n*n,id[i][j+1],inf,0);
    		}
    	while(spfa())
    		mcf();
    	printf("%d
    ",ans);
    	return 0;
    }
    
  • 相关阅读:
    Java中,&&与&,||与|的区别
    Hibernate中的merge方法 以及对象的几中状态
    你希望函数的某些参数强制使用关键字参数传递:
    7.1 可接受任意数量参数的函数:
    perl urlencode
    python UnicodeDecodeError: 'utf8' codec can't decode byte 0xd6 in position 15: invalid continuation
    python 使用__slots__
    python 面向对象编程
    Python flask post接口
    python flask get传参
  • 原文地址:https://www.cnblogs.com/lokiii/p/9646647.html
Copyright © 2011-2022 走看看