【BZOJ1930】[Shoi2003]pacman 吃豆豆 最大费用最大流
【BZOJ1930】[Shoi2003]pacman 吃豆豆
Description
Input
Output
Sample Input
8 1
1 5
5 7
2 2
7 8
4 6
3 3
6 4
Sample Output
HINT
N < = 2000
题解:由于只需要跑两次,所以可以采用费用流。首先我们不用考虑两条路径相交的情况,因为我们可以将相交的部分交换一下,就不相交了。
但是本题卡空间!!!所以有一个优化:如果a能到b,b能到c,则不需要连a到c的边。所以具体建边方法:
1. S -> i 容量1,费用0
2. i -> i' 容量1,费用1
3. i' -> j 容量2,费用0 (注意容量是2!因为我们的优化中相当于是用a-b-c替换了a-c)
4. i -> T 容量1,费用1
- #include <cstdio>
- #include <cstring>
- #include <iostream>
- #include <queue>
- #include <algorithm>
- using namespace std;
- int n,cnt,sum,S,T,ans;
- int inq[4020],dis[4020],head[4020],to[4000010],next[4000010],cost[4000010],flow[4000010],pv[4020],pe[4020];
- struct node
- {
- int x,y;
- }p[2010];
- queue<int> q;
- int bfs()
- {
- memset(dis,0xc0,sizeof(dis));
- dis[S]=0,q.push(S);
- int i,u;
- while(!q.empty())
- {
- u=q.front(),q.pop(),inq[u]=0;
- for(i=head[u];i!=-1;i=next[i]) if(dis[to[i]]<dis[u]+cost[i]&&flow[i])
- {
- pv[to[i]]=u,pe[to[i]]=i,dis[to[i]]=dis[u]+cost[i];
- if(!inq[to[i]]) inq[to[i]]=1,q.push(to[i]);
- }
- }
- return dis[T]>0;
- }
- inline int rd()
- {
- int ret=0,f=1; char gc=getchar();
- while(gc<'0'||gc>'9') {if(gc=='-')f=-f; gc=getchar();}
- while(gc>='0'&&gc<='9') ret=ret*10+gc-'0',gc=getchar();
- return ret*f;
- }
- inline void add(int a,int b,int c,int d)
- {
- to[cnt]=b,cost[cnt]=c,flow[cnt]=d,next[cnt]=head[a],head[a]=cnt++;
- to[cnt]=a,cost[cnt]=-c,flow[cnt]=0,next[cnt]=head[b],head[b]=cnt++;
- }
- bool cmp(const node &a,const node &b)
- {
- return (a.x==b.x)?(a.y<b.y):(a.x<b.x);
- }
- int main()
- {
- n=rd(),S=0,T=2*n+1;
- int i,j;
- memset(head,-1,sizeof(head));
- for(i=1;i<=n;i++) add(S,i,0,1),add(i+n,T,0,1),add(i,i+n,1,1),add(i,i+n,0,1),p[i].x=rd(),p[i].y=rd();
- sort(p+1,p+n+1,cmp);
- for(i=1;i<=n;i++)
- {
- int mn=1<<30;
- for(j=i+1;j<=n;j++) if(p[j].y>=p[i].y&&p[j].y<mn) add(i+n,j,0,2),mn=p[j].y;
- }
- while(bfs())
- {
- int mf=1<<30;
- for(i=T;i!=S;i=pv[i]) mf=min(mf,flow[pe[i]]);
- sum+=mf,ans+=dis[T]*mf;
- if(sum==2) break;
- for(i=T;i!=S;i=pv[i]) flow[pe[i]]-=mf,flow[pe[i]^1]+=mf;
- }
- printf("%d",ans);
- return 0;
- }//13 1 1 2 2 3 3 4 4 5 5 6 6 1 3 2 4 3 5 4 6 5 7 6 8 4 1
【BZOJ1930】[Shoi2003]pacman 吃豆豆 最大费用最大流的更多相关文章
- 【BZOJ 1930】 [Shoi2003]pacman 吃豆豆 最大费用最大流
如果你知道他是网络流的话你就很快会想到一个最大费用最大流的模型,然后你发现可能T,然而你发现你只用增广两次,然后你就开心的打了出来,然后发现被稠密图里spfa的丧病时间复杂度坑了,还是会T.于是我就开 ...
- BZOJ1930 [Shoi2003]pacman 吃豆豆
dp,首先建出图,f[i][j]表示a吃到了i点,b吃到了j点的最大值,转移的时候转移拓扑序小的那一维,如果i拓扑序小于j,那么转移到f[k][j],否则转移到f[i][k],建出的图边数也要优化, ...
- bzoj 1930: [Shoi2003]pacman 吃豆豆 [费用流]
1930: [Shoi2003]pacman 吃豆豆 题意:两个PACMAN吃豆豆.一开始的时候,PACMAN都在坐标原点的左下方,豆豆都在右上方.PACMAN走到豆豆处就会吃掉它.PACMAN行走的 ...
- 1930: [Shoi2003]pacman 吃豆豆
1930: [Shoi2003]pacman 吃豆豆 Time Limit: 10 Sec Memory Limit: 64 MBSubmit: 1969 Solved: 461[Submit][ ...
- 【BZOJ1930】【SHOI2003】吃豆豆
初见杀…… 原题: 两个PACMAN吃豆豆.一开始的时候,PACMAN都在坐标原点的左下方,豆豆都在右上方.PACMAN走到豆豆处就会吃掉它.PACMAN行走的路线很奇怪,只能向右走或者向上走,他们行 ...
- [bzoj]1930 pacman吃豆豆
Description 两个PACMAN吃豆豆.一开始的时候,PACMAN都在坐标原点的左下方,豆豆都在右上方.PACMAN走到豆豆处就会吃掉它.PACMAN行走的路线很奇怪,只能向右走或者向上走,他 ...
- 洛谷 P4066 [SHOI2003]吃豆豆 解题报告
P4066 [SHOI2003]吃豆豆 题目描述 两个PACMAN吃豆豆.一开始的时候,PACMAN都在坐标原点的左下方,豆豆都在右上方.PACMAN走到豆豆处就会吃掉它.PACMAN行走的路线很奇怪 ...
- HTML5吃豆豆游戏开发实战(一)使用Canvas绘制游戏主角
近期在学习HTML5.爱因斯坦曾说过,"最好的学习就是自己去经历". 于是.我想在学习HTML5的同一时候.做一款简单的小游戏,这样学习起来也会非常有趣的.我想做的是曾经小时候玩儿 ...
- css动画实现吃豆豆
话不多说,直接上代码:(作为一个初学者写的代码,多么0基础都能看的懂吧.) HTML部分 <!DOCTYPE html> <html lang=en> <head> ...
随机推荐
- Quartz定时框架入门
Quartz框架是Java开源的定时任务调度器,Quartz框架中有如下核心概念: 1. Job 任务接口,接口中只声明方法void execute(JobExecutionContext conte ...
- driver: Linux设备模型之input子系统具体解释
本节从总体上解说了输入子系统的框架结构.有助于读者从总体上认识linux的输入子系统.在陷入代码分析的过程中,通过本节的知识可以找准方向,明确原理. 本节重点: 输入子系统的框架结构 各层相应内核中的 ...
- 香蕉派 Banana pi BPI-M1+ 双核开源单板计算机. 板载WIFI
Banana PI BPI-M1+是一款高性能双核开源硬件单板计算机,Banana PI BPI-M1+是一款比树莓派更强悍的双核Android4.4与Linux产品. Banana PI BP ...
- ColorSchemer Studio 2 破解
软件介绍: ColorSchemer Studio 2 is a professional color matching application for anyone from hobbyists t ...
- Axure RP Extension for Chrome
1.打开Chrome浏览器,找到“更多工具 -> 扩展程序”: 2.将下载的Axure-RP-Extension-for-Chrome-0.6.2.crx文件拖到界面当中: 3.安装成功后,勾选 ...
- selenium从入门到应用 - 8,selenium+testNG实现多线程的并发测试
本系列所有代码 https://github.com/zhangting85/simpleWebtest本文将介绍一个Java+TestNG+Maven+Selenium的web自动化测试脚本环境下s ...
- GCC与G++那些事儿
StackOverflow上一个很有名的问题,gcc和g++到底有什么区别? 答案如下: GCC: GNU Compiler Collection 指的是GNU编译器所支持的所有不同的类型的语言 gc ...
- 基于ShaderX5的顶点动画
关于顶点动画,ShaderX5里有篇专门来讲,在虚幻3引擎里也有一个更加丰富的实现.使用了一个Pivot Painter的3dmax脚本.其实自己灵活用vertex color可以避开使用Pivot ...
- Swift学习-枚举(Enumerations)的使用方法
Swift学习-枚举的使用方法 枚举的使用语法: enum someEnumer { // 枚举的成员值 } 以下是方向的一个例子: enum direction { case Up case Dow ...
- rational rose 2007安装破解全过程
1:下载安装文件 下载地址: http://pan.baidu.com/s/1c0ldKEs 2:下载虚拟光驱 由于下载的文件须要光驱安装,所以须要下载一个虚拟光驱,虚拟光驱名称:daemon too ...