zoukankan      html  css  js  c++  java
  • bzoj4873: [Shoi2017]寿司餐厅

    调了大半个钟居然是len没有初始化。。。

    好好的恶补了一下最大权闭合子图呢。。构图大概是这样的:

    然而中间寿司连方案的话边数可以到n^3的,这样会很龟

    所以可以用一个小trick,对于l,r,假如l+1,r和l,r-1都OK,也就OK了,所以这两个点向l,r连边,这样就降到n^2了

    #include<cstdio>
    #include<iostream>
    #include<cstring>
    #include<cstdlib>
    #include<algorithm>
    #include<cmath>
    using namespace std;
    const int inf=(1<<30)-1;
    
    struct node
    {
        int x,y,c,next;
    }a[210000];int len,last[11000];
    void ins(int x,int y,int c)
    {
        len++;
        a[len].x=x;a[len].y=y;a[len].c=c;
        a[len].next=last[x];last[x]=len;
        
        len++;
        a[len].x=y;a[len].y=x;a[len].c=0;
        a[len].next=last[y];last[y]=len;
    }
    int h[11000],st,ed;
    int list[11000];
    bool bt_h()
    {
        memset(h,0,sizeof(h));h[st]=1;
        int head=1,tail=2;list[1]=st;
        while(head!=tail)
        {
            int x=list[head];
            for(int k=last[x];k;k=a[k].next)
            {
                int y=a[k].y;
                if(a[k].c>0&&h[y]==0)
                {
                    h[y]=h[x]+1;
                    list[tail++]=y;
                }
            }
            head++;
        }
        return h[ed]!=0;
    }
    int findflow(int x,int f)
    {
        if(x==ed)return f;
        int s=0;
        for(int k=last[x];k;k=a[k].next)
        {
            int y=a[k].y;
            if(a[k].c>0&&h[y]==h[x]+1&&s<f)
            {
                int t=findflow(y,min(a[k].c,f-s));
                s+=t;a[k].c-=t;a[k^1].c+=t;
            }
        }
        if(s==0)h[x]=0;
        return s;
    }
    
    //---------------------------------findflow---------------------------------------------------
    
    int tap[110],mp[110][110];
    int z,id[1100],mid[110][110];
    int main()
    {
        int n,m;
        scanf("%d%d",&n,&m); z=n;
        for(int i=1;i<=n;i++)
        {
            scanf("%d",&tap[i]);
            if(id[tap[i]]==0)id[tap[i]]=++z;
        }
        for(int i=1;i<=n;i++)
            for(int j=i;j<=n;j++)
                scanf("%d",&mp[i][j]),mid[i][j]=++z;
                
        //...........read.............
                
        st=++z,ed=++z; len=1;
        for(int i=1;i<=1000;i++)
            if(id[i])ins(st,id[i],m*i*i);
        for(int i=1;i<=n;i++)
            ins(id[tap[i]],i,inf),ins(st,i,tap[i]);
        int sum=0;
        for(int i=1;i<=n;i++)
            for(int j=i;j<=n;j++)
            {
                if(i==j)ins(i,mid[i][j],inf);
                else ins(mid[i+1][j],mid[i][j],inf),ins(mid[i][j-1],mid[i][j],inf);
                
                if(mp[i][j]>=0)ins(mid[i][j],ed,mp[i][j]),sum+=mp[i][j];
                else ins(st,mid[i][j],-mp[i][j]);
            }    
        
        //......composition............
        
        int ans=0;
        while(bt_h())
        {
            ans+=findflow(st,inf);
        }
        printf("%d
    ",sum-ans);
        
        return 0;
    }
  • 相关阅读:
    Caliburn.Micro学习笔记(四)----IHandle<T>实现多语言功能
    linux irq 自动探测
    gpio子系统和pinctrl子系统(下)
    gpio子系统和pinctrl子系统(中)
    gpio子系统和pinctrl子系统(上)
    linux驱动基础系列--linux spi驱动框架分析
    linux驱动基础系列--linux rtc子系统
    linux驱动基础系列--Linux I2c驱动分析
    camera驱动框架分析(上)
    camera驱动框架分析(中)
  • 原文地址:https://www.cnblogs.com/AKCqhzdy/p/10252267.html
Copyright © 2011-2022 走看看