bzoj2879: [Noi2012]美食节

费用流加动态建点。

考虑加的点是倒数第几个做的菜,它对答案的共享就是i倍的时间。

和bzoj1070修车那道题一样。

#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
const int maxk = 100 + 10;
const int maxn = 10000 + 10;
const int maxm = 2000000 + 10;
const int inf = 0x3f3f3f3f;
int g[maxn],v[maxm],next[maxm],c[maxm],f[maxm],eid;
int n,m,res,p,vid,S,T;
int id[maxk][1010],cnt[maxk];
int a[maxk][maxk];
int q[maxm],l,r,u;
bool inque[maxn];
int dist[maxn],pre[maxn];

void addedge(int a,int b,int F,int C) {
    v[eid]=b; f[eid]=F; c[eid]=C;  next[eid]=g[a]; g[a]=eid++;
    v[eid]=a; f[eid]=0; c[eid]=-C; next[eid]=g[b]; g[b]=eid++;
}

void build() {
    memset(g,-1,sizeof(g));
    scanf("%d%d",&n,&m);
    vid=n; S=0; T=maxn-10;
    for(int i=1,x;i<=n;i++) {
        scanf("%d",&x);
        addedge(S,i,x,0);
        p+=x;
    }
    for(int i=1;i<=m;i++) {
        id[i][++cnt[i]]=++vid;
        addedge(id[i][cnt[i]],T,1,0);
    }
    for(int i=1;i<=n;i++)
    for(int j=1;j<=m;j++) {
        scanf("%d",&a[i][j]);
        addedge(i,id[j][cnt[j]],1,a[i][j]);
    }
}

void augment() {
    int aug=inf,cur=0;
    for(int i=T;i!=S;i=v[pre[i]^1]) aug=min(aug,f[pre[i]]);
    for(int i=T;i!=S;i=v[pre[i]^1]) {
        f[pre[i]]-=aug;
        f[pre[i]^1]+=aug;
        cur+=aug*c[pre[i]];
    }
    res+=cur;
}

int SPFA() {
    memset(dist,0x3f,sizeof(dist));
    dist[S]=0;
    q[r++]=S;
    while(l<r) {
        inque[u=q[l++]]=0;
        for(int i=g[u];~i;i=next[i]) if(f[i]&&dist[v[i]]>dist[u]+c[i])    {
            dist[v[i]]=dist[u]+c[i];
            pre[v[i]]=i;
            if(!inque[v[i]]) inque[q[r++]=v[i]]=1;
        }
    }
    //printf("test %d\n",dist[T]);
    augment();
    return v[pre[T]^1];
}

void alter(int pos) {
    int x;
    for(int i=1;i<=m;i++) if(id[i][cnt[i]]==pos) {x=i; break;}
    id[x][++cnt[x]]=++vid;
    addedge(id[x][cnt[x]],T,1,0);
    for(int i=1;i<=n;i++) addedge(i,id[x][cnt[x]],1,a[i][x]*cnt[x]);
}

void solve() {
    res=0;
    for(int i=1;i<=p;i++) alter(SPFA());
    printf("%d\n",res);
}

int main() {
    build();
    solve();
    return 0;
}
时间: 2024-10-06 23:44:08

bzoj2879: [Noi2012]美食节的相关文章

bzoj2879 [Noi2012]美食节 [费用流动态加边]

Description CZ市为了欢迎全国各地的同学,特地举办了一场盛大的美食节.作为一个喜欢尝鲜的美食客,小M自然不愿意错过这场盛宴.他很快就尝遍了美食节所有的美食.然而,尝鲜的欲望是难以满足的.尽管所有的菜品都很可口,厨师做菜的速度也很快,小M仍然觉得自己桌上没有已经摆在别人餐桌上的美食是一件无法忍受的事情.于是小M开始研究起了做菜顺序的问题,即安排一个做菜的顺序使得同学们的等待时间最短.小M发现,美食节共有n种不同的菜品.每次点餐,每个同学可以选择其中的一个菜品.总共有m个厨师来制作这些菜

[BZOJ2879] [Noi2012] 美食节 (费用流 &amp; 动态加边)

Description CZ市为了欢迎全国各地的同学,特地举办了一场盛大的美食节.作为一个喜欢尝鲜的美食客,小M自然不愿意错过这场盛宴.他很快就尝遍了美食节所有的美食.然而,尝鲜的欲望是难以满足的.尽管所有的菜品都很可口,厨师做菜的速度也很快,小M仍然觉得自己桌上没有已经摆在别人餐桌上的美食是一件无法忍受的事情.于是小M开始研究起了做菜顺序的问题,即安排一个做菜的顺序使得同学们的等待时间最短.小M发现,美食节共有n种不同的菜品.每次点餐,每个同学可以选择其中的一个菜品.总共有m个厨师来制作这些菜

[BZOJ2879][Noi2012]美食节(最小费用最大流动态加边)

题目:http://www.lydsy.com:808/JudgeOnline/problem.php?id=2879 分析: 和bzoj1070一样,但这题的数据范围大了很多,如果直接建图就会TLE. 因为对于每个厨师对应的分裂成的n个点,一定是前面的点满流后才会可能扩展后面的点.于是可以先把每个厨师的第一个点加入图中,增广一次,然后把对于当前增广的那条路对应的厨师的下一个点加入图中.

【BZOJ-2879】美食节 最小费用最大流 + 动态建图

2879: [Noi2012]美食节 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 1366  Solved: 737[Submit][Status][Discuss] Description CZ市为了欢迎全国各地的同学,特地举办了一场盛大的美食节.作为一个喜欢尝鲜的美食客,小M自然不愿意错过这场盛宴.他很快就尝遍了美食节所有的美食.然而,尝鲜的欲望是难以满足的.尽管所有的菜品都很可口,厨师做菜的速度也很快,小M仍然觉得自己桌上没有已经摆在别人

2879: [Noi2012]美食节 - BZOJ

Description CZ市为了欢迎全国各地的同学,特地举办了一场盛大的美食节.作为一个喜欢尝鲜的美食客,小M自然不愿意错过这场盛宴.他很快就尝遍了美食节所有的美食.然而,尝鲜的欲望是难以满足的.尽管所有的菜品都很可口,厨师做菜的速度也很快,小M仍然觉得自己桌上没有已经摆在别人餐桌上的美食是一件无法忍受的事情.于是小M开始研究起了做菜顺序的问题,即安排一个做菜的顺序使得同学们的等待时间最短.小M发现,美食节共有n种不同的菜品.每次点餐,每个同学可以选择其中的一个菜品.总共有m个厨师来制作这些菜

bzoj 2879: [Noi2012]美食节(费用流+动态加边)

2879: [Noi2012]美食节 Time Limit: 10 Sec Memory Limit: 512 MB Submit: 1453 Solved: 778 [Submit][Status][Discuss] Description CZ市为了欢迎全国各地的同学,特地举办了一场盛大的美食节.作为一个喜欢尝鲜的美食客,小M自然不愿意错过这场盛宴.他很快就尝遍了美食节所有的... http://bbs.chinaacc.com/forum-2-3/topic-5785721.html ht

【bzoj2879】[Noi2012]美食节 费用流+动态加边

原文地址:http://www.cnblogs.com/GXZlegend 题目描述 CZ市为了欢迎全国各地的同学,特地举办了一场盛大的美食节.作为一个喜欢尝鲜的美食客,小M自然不愿意错过这场盛宴.他很快就尝遍了美食节所有的美食.然而,尝鲜的欲望是难以满足的.尽管所有的菜品都很可口,厨师做菜的速度也很快,小M仍然觉得自己桌上没有已经摆在别人餐桌上的美食是一件无法忍受的事情.于是小M开始研究起了做菜顺序的问题,即安排一个做菜的顺序使得同学们的等待时间最短.小M发现,美食节共有n种不同的菜品.每次点

BZOJ 2879 NOI2012美食节

链接:http://www.lydsy.com/JudgeOnline/problem.php?id=2879 CZ市为了欢迎全国各地的同学,特地举办了一场盛大的美食节.作为一个喜欢尝鲜的美食客,小M自然不愿意错过这场盛宴.他很快就尝遍了美食节所有的美食.然而,尝鲜的欲望是难以满足的.尽管所有的菜品都很可口,厨师做菜的速度也很快,小M仍然觉得自己桌上没有已经摆在别人餐桌上的美食是一件无法忍受的事情.于是小M开始研究起了做菜顺序的问题,即安排一个做菜的顺序使得同学们的等待时间最短.小M发现,美食节

BZOJ 2879 [Noi2012]美食节 | 费用流 动态开点

这道题就是"修车"的数据加强版--但是数据范围扩大了好多,应对方法是"动态开点". 首先先把"所有厨师做的倒数第一道菜"和所有菜连边,然后跑一下spfa,找出哪一个厨师在增广路上,把"这个厨师做的倒数第二道菜"和所有菜连边,然后继续spfa,如此循环往复直到spfa找不出最短路. #include <queue> #include <cstdio> #include <cmath> #inc