AC通道:http://www.lydsy.com/JudgeOnline/problem.php?id=2879

这题codevs上也有,不过数据不同:http://codevs.cn/problem/1935/

如果你觉得你的程序跑得很快,那么你可以交codevs,如果你觉得你的程序可能是错的,那么请你交BZOJ

BZOJ数据貌似厉害一些?不过BZOJ时限也放得开些。

这题就是上题的升级版,在修车的基础上,数据很大,所以需要通过动态加边来使其变快。

因为上题也分析到了,只有厨师走完短的路,才会走长的,那么如果没走短的路,我长的路留在这里只是增加spfa的复杂度。

然后动态加边就可以了。

这个题刚开始的思路是错的,就是我在动态加边的同时,可以动态加点,但这样需要一个数组记下这是哪个厨师,也要记下这是厨师的第几个菜。

但是发现如果我的费用流需要退流的话,我记录第几个菜的数组需要-1,但是我做不到,这会导致这个点被重复算几次,然后就比答案小了。

所以必须确定下位置,这样的话,你就不会重复的添加点了,最多重复添加相同意义的边,而因为流量限制,这条边没有实际意义。

不过这样的话,速度就会变慢...

好慢啊好慢啊...

#include<queue>
#include<cstdio>
#include<cstring>
#include<algorithm> using namespace std; const int maxn=;
const int maxm=;
const int maxp=;
const int INF=0x3f3f3f3f; struct Node{
int data,next,low,cost;
}node[maxp*maxn*]; #define now node[point].data
#define www node[point].low
#define ccc node[point].cost
#define then node[point].next int n,m,cnt,ans;
int s,t,Idex,tot;
int head[maxp];
int c[maxp],ind[maxp],ink[maxp];
int dis[maxp],pre[maxp];
int a[maxm][maxm];
bool inq[maxp];
deque<int >q; void add(int u,int v,int w,int c){
node[cnt].data=v;node[cnt].next=head[u];node[cnt].low=w;node[cnt].cost=c;head[u]=cnt++;
node[cnt].data=u;node[cnt].next=head[v];node[cnt].low=;node[cnt].cost=-c;head[v]=cnt++;
} bool SPFA(){
int x,Low=INF,ta,tb;
memset(dis,0x3f,sizeof(dis));
q.push_back(s);dis[s]=;pre[s]=pre[t]=-;
while(!q.empty()){
x=q.front();q.pop_front();inq[x]=false;
for(int point=head[x];point!=-;point=then)
if(www && dis[now]>dis[x]+ccc){
dis[now]=dis[x]+ccc;pre[now]=point^;
if(!inq[now]){
inq[now]=true;
if(q.empty() || dis[q.front()]>dis[now])
q.push_front(now);
else
q.push_back(now);
}
}
}
if(pre[t]<) return false;
for(int point=pre[t];point!=-;point=pre[now]){
if(now==s){
x=node[point^].data;
ta=(x-)/tot+;tb=x%tot+;
}
Low=min(Low,min(Low,node[point^].low));
}
for(int point=pre[t];point!=-;point=pre[now])
node[point^].low-=Low,www+=Low;
for(int i=;i<=m;i++)
add((ta-)*tot+tb,n*tot+i,,tb*a[ta][i]);
ans+=Low*dis[t];
return true;
} int main(){
#ifndef ONLINE_JUDGE
freopen("2879.in","r",stdin);
freopen("2879.out","w",stdout);
#endif
scanf("%d%d",&m,&n);
for(int i=;i<=m;i++) scanf("%d",&c[i]),tot+=c[i];
for(int i=;i<=m;i++)
for(int j=;j<=n;j++)
scanf("%d",&a[j][i]);
t=n*tot+m+;
for(int i=s;i<=t;i++) head[i]=-;
for(int i=;i<=n*tot;i++) add(s,i,,);
for(int i=;i<=m;i++)
add(n*tot+i,t,c[i],);
for(int i=;i<=n;i++)
for(int k=;k<=m;k++)
add((i-)*tot+,n*tot+k,,a[i][k]);
while(SPFA());
printf("%d",ans);
return ;
}

BZOJ2879 [Noi2012]美食节的更多相关文章

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

    Description CZ市为了欢迎全国各地的同学,特地举办了一场盛大的美食节.作为一个喜欢尝鲜的美食客,小M自然不愿意错过这场盛宴.他很快就尝遍了美食节所有的美食.然而,尝鲜的欲望是难以满足的.尽 ...

  2. [BZOJ2879][NOI2012]美食节(费用流)

    设sm为所有p之和,套路地对每道菜建一个点,将每个厨师拆成sm个点,做的倒数第i道菜的代价为time*i. S向每道菜连边<0,p[i]>(前者为代价后者为流量),i菜到j厨师的第k个点连 ...

  3. [BZOJ2879][Noi2012]美食节(费用流)

    题目描述 CZ市为了欢迎全国各地的同学,特地举办了一场盛大的美食节.作为一个喜欢尝鲜的美食客,小M自然不愿意错过这场盛宴.他很快就尝遍了美食节所有的美食.然而,尝鲜的欲望是难以满足的.尽管所有的菜品都 ...

  4. BZOJ2879 [Noi2012]美食节 【费用流】

    题目 CZ市为了欢迎全国各地的同学,特地举办了一场盛大的美食节.作为一个喜欢尝鲜的美食客,小M自然不愿意错过这场盛宴.他很快就尝遍了美食节所有的美食.然而,尝鲜的欲望是难以满足的.尽管所有的菜品都很可 ...

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

    题目:http://www.lydsy.com:808/JudgeOnline/problem.php?id=2879 分析: 和bzoj1070一样,但这题的数据范围大了很多,如果直接建图就会TLE ...

  6. 【BZOJ2879】[Noi2012]美食节 动态加边网络流

    [BZOJ2879][Noi2012]美食节 Description CZ市为了欢迎全国各地的同学,特地举办了一场盛大的美食节.作为一个喜欢尝鲜的美食客,小M自然不愿意错过这场盛宴.他很快就尝遍了美食 ...

  7. BZOJ 2879: [Noi2012]美食节

    2879: [Noi2012]美食节 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 1834  Solved: 969[Submit][Status] ...

  8. C++之路进阶——bzoj2879(美食节)

    2879: [Noi2012]美食节 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 1304  Solved: 702[Submit][Status] ...

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

    2879: [Noi2012]美食节 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 1366  Solved: 737[Submit][Status] ...

随机推荐

  1. C++排列对称串

    题目内容:字符串有些是对称的,有些是不对称的,请将那些对称的字符串按从小到大的顺序输出.字符串先以长度论大小,如果长度相同,再以ASCII码值为排序标准. 输入描述:输入数据中含有一些字符串(1< ...

  2. FileInputStream利用缓冲数组读取数据

    package cd.itcast.fileinputstream; import java.io.File; import java.io.FileInputStream; import java. ...

  3. IEnumerable 接口 实现foreach 遍历 实例

    额 为啥写着东西? 有次面试去,因为用到的时候特别少 所以没记住, 这个单词 怎么写! 经典的面试题: 能用foreach遍历访问的对象的要求? 答:  该类实现IEnumetable 接口   声明 ...

  4. 包(package) 与 导入(import) 语句剖析

    A) 包(package):用于将完成不同功能的类分门别类,放在不同的目录下. B)命名规则:将公司域名翻转作为包名.例如www.vmaxtam.com域名,那么包名就是com.vmaxtam 每个字 ...

  5. StyleCop学习笔记——自定义规则

    本文将简单的一步一步的指导这可能有助于学习如何创建自己的规则 1.创建一个项目. Visual Studio创建一个新的类库项目.NET3.5 2.引用两个DLL,StyleCop.dll和Style ...

  6. SQLserver中idendity的妙用

    假设:现在有产品信息需要入库,要给每个产品按找预定的规则进行编号,编号规则如下: 产品编码:6位产品类型码+1位仓库码+2位年份+5位顺序码(要求从00001开始自增) 6位产品类型码:P00001 ...

  7. poj 1383 Labyrinth

    题目连接 http://poj.org/problem?id=1383 Labyrinth Description The northern part of the Pyramid contains ...

  8. Android 创建单例模式的几种方法

    java模式之单例模式:单例模式确保一个类只有一个实例,自行提供这个实例并向整个系统提供这个实例.特点:1,一个类只能有一个实例2,自己创建这个实例3,整个系统都要使用这个实例 Singleton模式 ...

  9. 详解iOS多线程 (转载)

    iPhone 中的线程应用并不是无节制的,官方给出的资料显示iPhone OS下的主线程的堆栈大小是1M,第二个线程开始都是512KB.并且该值不能通过编译器开关或线程API函数来更改. 只有主线程有 ...

  10. SQL中一种类似GUID值的函数实现

        开发中会需要用到多列值组合成一个ID值的情况.比如做数据清洗的时候,一张表A有五列,分别是医院.科室.医生.职称.电话.面有许多重复的数据需要和另一个表B(和A列相同)做对比.清洗需要做两件事 ...