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 ;
}

最新文章

  1. RCC BUCK-BOOST变压器设计
  2. Linux常用指令---ps(查看进程)
  3. font-family属性与字体对齐
  4. 《摇滚南京》——&quot;人生下来就是孤独&quot;
  5. nagios-解决监控页面上的乱码
  6. 转载:mysql update更新带子查询的实现方式
  7. 检测 NSObject 对象持有的强指针
  8. 如何在客户端配置ODBC来访问远程DB2 for Windows服务器
  9. NOI2010 航空管制
  10. Visual Studio的广告剧
  11. SQLLoader5(从多个数据文件导入到同一张表)
  12. 网页制作之html基础学习3-css样式表
  13. Java设计模式菜鸟系列(七)命令模式建模与实现
  14. Android Preference详解
  15. JS JQ 深拷贝之坑
  16. 133A
  17. Python之__slots__ &amp;运算符重载反向运算
  18. QMouseEvent鼠标事件
  19. 【实战】Docker 入门实战一:ubuntu 和 centos 安装Docker
  20. 5分钟简述Spring中的DI与AOP

热门文章

  1. C#操作xml
  2. [leetcode]_Longest Common Prefix
  3. freefilesync 7 使用
  4. MongoDB(4):多种方式关闭服务命令
  5. php分页代码实例
  6. PHP Startup: Unable to load dynamic library
  7. jQuery学习笔记(1)
  8. RAC本地数据文件迁移至ASM的方法--非归档模式
  9. Partitioner没有被调用的情况
  10. ios 工程图片清理shell