浴谷 P1768 天路
题目描述
“那是一条神奇的天路诶~,把第一个神犇送上天堂~”,XDM先生唱着这首“亲切”的歌曲,一道猥琐题目的灵感在脑中出现了。
和C_SUNSHINE大神商量后,这道猥琐的题目终于出现在本次试题上了,旨在难到一帮大脑不够灵活的OIer们(JOHNKRAM真的不是说你……)。
言归正传,小X的梦中,他在西藏开了一家大型旅游公司,现在,他要为西藏的各个景点设计一组铁路线。但是,小X发现,来旅游的游客都很挑剔,他们乘火车在各个景点间游览,景点的趣味当然是不用说啦,关键是路上。试想,若是乘火车一圈转悠,却发现回到了游玩过的某个景点,花了一大堆钱却在路上看不到好的风景,那是有多么的恼火啊。
所以,小X为所有的路径定义了两个值,Vi和Pi,分别表示火车线路的风景趣味度和乘坐一次的价格。现在小X想知道,乘客从任意一个景点开始坐火车走过的一条回路上所有的V之和与P之和的比值的最大值。以便为顾客们推荐一条环绕旅游路线(路线不一定包含所有的景点,但是不可以存在重复的火车路线)。
于是,小X梦醒之后找到了你……
输入输出格式
输入格式:
第一行两个正整数N,M,表示有N个景点,M条火车路线,火车路线是单向的。
以下M行,每行4个正整数,分别表示一条路线的起点,终点,V值和P值。
注意,两个顶点间可能有多条轨道,但一次只能走其中的一条。
输出格式:
一个实数,表示一条回路上最大的比值,保留1位小数。
若没有回路,输出-1。
输入输出样例
- 5 6
- 1 2 1 1
- 4 1 6 2
- 5 4 8 1
- 2 3 2 2
- 5 2 4 1
- 3 5 6 4
- 2.3
说明
对于30%的数据,1≤N≤100,1≤M≤20;
对于60%的数据,1≤N≤3,000,1≤M≤2,000;
对于100%的数据,1≤N≤7,000,1≤M≤20,000,1≤Vi,Pi≤1,000.
保证答案在200以内.
思路:01分数规划。
尽管加上了各种优化,还是只能拿80分。
- #include<deque>
- #include<cstdio>
- #include<cstring>
- #include<iostream>
- #include<algorithm>
- #define MAXN 50010
- using namespace std;
- int n,m,tot;
- double l,r,mid;
- double intrest[MAXN],cap[MAXN],dis[MAXN];
- int to[MAXN],head[MAXN],net[MAXN],vis[MAXN],num[MAXN];
- inline int read(){
- char ch=getchar();int data=;
- while(ch<''||ch>'') ch=getchar();
- do{
- data=data*+ch-'';
- ch=getchar();
- }while(ch>='' && ch<='');
- return data;
- }
- inline void add(int u,int v,double w,double p){
- to[++tot]=v;net[tot]=head[u];intrest[tot]=w;cap[tot]=p;head[u]=tot;
- }
- inline bool spfa(int s){
- deque<int>que;
- memset(vis,,sizeof(vis));
- memset(num,,sizeof(num));
- memset(dis,0x7f,sizeof(dis));
- que.push_back(s);
- dis[s]=;vis[s]=;num[s]++;
- while(!que.empty()){
- int now=que.front();
- que.pop_front();
- vis[now]=;
- for(int i=head[now];i;i=net[i])
- if(dis[to[i]]>dis[now]+mid*cap[i]-intrest[i]){
- dis[to[i]]=dis[now]+mid*cap[i]-intrest[i];
- if(!vis[to[i]]){
- if(dis[to[i]]>dis[now]) que.push_back(to[i]);
- else que.push_front(to[i]);
- vis[to[i]]=;
- num[to[i]]++;
- if(num[to[i]]>n) return true;
- }
- }
- }
- return false;
- }
- inline bool check(double x){
- if(spfa()) return true;
- else return false;
- }
- int main(){
- n=read();m=read();
- for(int i=;i<=m;i++){
- int x,y;double v,p;
- x=read();y=read();
- scanf("%lf%lf",&v,&p);
- add(x,y,v,p);
- }
- for(int i=;i<=n;i++) add(,i,,);
- l=;r=;
- while(r-l>0.01){
- mid=(l+r)/;
- if(check(mid)) l=mid;
- else r=mid;
- }
- if(l==) cout<<"-1";
- else printf("%.1lf",r);
- }
bfs的spfa判负环
dfs判负环AC 19ms
- #include<deque>
- #include<cstdio>
- #include<cstring>
- #include<iostream>
- #include<algorithm>
- #define MAXN 50010
- using namespace std;
- int n,m,tot;
- double l,r,mid,ans;
- double intrest[MAXN],cap[MAXN],dis[MAXN];
- int to[MAXN],head[MAXN],net[MAXN],vis[MAXN];
- inline void add(int u,int v,double w,double p){
- to[++tot]=v;net[tot]=head[u];intrest[tot]=w;cap[tot]=p;head[u]=tot;
- }
- bool spfa(int now){
- vis[now]=;
- for(int i=head[now];i;i=net[i])
- if(dis[to[i]]>dis[now]+mid*cap[i]-intrest[i]){
- dis[to[i]]=dis[now]+mid*cap[i]-intrest[i];
- if(vis[to[i]]||spfa(to[i])){
- vis[to[i]]=;
- return true;
- }
- }
- vis[now]=;
- return false;
- }
- inline bool check(double x){
- for(int i=;i<=n;i++)
- if(spfa(i)) return true;
- return false;
- }
- int main(){
- scanf("%d%d",&n,&m);
- for(int i=;i<=m;i++){
- int x,y;double v,p;
- scanf("%d%d",&x,&y);
- scanf("%lf%lf",&v,&p);
- add(x,y,v,p);
- }
- l=;r=;
- while(r-l>0.01){
- mid=(l+r)/;
- if(check(mid)){
- ans=mid;
- l=mid;
- }
- else r=mid;
- }
- if(l==) cout<<"-1";
- else printf("%.1lf",ans);
- }
对比一下spfa的bfs判负环和dfs判负环的时间复杂度:
、
这些是bfs的尽管加上了各种优化还以一直TLE
而下面的:
第一行是没加读入优化的dfs。
第二行是加上读入优化的dfs。
dfs的速度秒杀bfs
浴谷 P1768 天路的更多相关文章
- 洛谷 P1768 天路
P1768 天路 题目描述 “那是一条神奇的天路诶~,把第一个神犇送上天堂~”,XDM先生唱着这首“亲切”的歌曲,一道猥琐题目的灵感在脑中出现了. 和C_SUNSHINE大神商量后,这道猥琐的题目终于 ...
- 浴谷夏令营例题Codeforces827DBest Edge Weight(三个愿望,一次满足~(大雾
这题在浴谷夏令营wyx在讲的最小生成树的时候提到过,但并没有细讲怎么写... 这题可以用三种写法写,虽然只有两种能过...(倍增/倍增+并查集/树链剖分 先跑出最小生成树,分类讨论,在MST上的边,考 ...
- [P1768]天路(分数规划+SPFA判负环)
题目描述 “那是一条神奇的天路诶~,把第一个神犇送上天堂~”,XDM先生唱着这首“亲切”的歌曲,一道猥琐题目的灵感在脑中出现了. 和C_SUNSHINE大神商量后,这道猥琐的题目终于出现在本次试题上了 ...
- Luogu P1768 天路 0/1分数规划+dfs spfa
“那是一条神奇的天路诶~~把第一个神犇送上天堂” 怕不是某大佬早就A了这题,然鹅我又调了很久很久... 好吧就是0/1分数规划,但是跑的dfs的spfa(好像题解说bfs过不了????不知) 发现把s ...
- 浴谷八连测R6题解(收获颇丰.jpg)
这场的题都让我收获颇丰啊QWQ 感谢van♂老师 T1 喵喵喵!当时以为经典题只能那么做, 思维定势了... 因为DP本质是通过一些条件和答案互相递推的一个过程, 实际上就是把条件和答案分配在DP的状 ...
- 浴谷八连测R4题解
一开始出了点bug能看见排行榜,于是我看见我半个小时就A掉了前两题,信心场QAQ T1字符串题就不说了qwq #include<iostream> #include<cstring& ...
- 洛谷10月月赛R2·浴谷八连测R3题解
早上打一半就回家了... T1傻逼题不说了...而且我的写法比题解要傻逼很多T T T2可以发现,我们强制最大值所在的块是以左上为边界的倒三角,然后旋转4次就可以遍历所有的情况.所以二分极差,把最大值 ...
- 浴谷金秋线上集训营 T11738 伪神(树链剖分)
先树链剖分,一棵子树的编号在数组上连续,一条链用树链剖分,把这些线段全部取出来,做差分,找到有多少点被>=t条线段覆盖即可. #include<iostream> #include& ...
- luogu P1768 天路
嘟嘟嘟 01分数规划之最优比率环. 主要是发一下基于dfs的spfa.跑的贼快,原来总用时2000多ms还TLE了两个点,改成dfs后总用时直降43ms! #include<cstdio> ...
随机推荐
- PIC kit3问题
1.通过pic kit3烧录pic16F1938的时候,pic kit3自动更新了firmware,但是仍然烧录不了pic16F1938,然后再次用pic kit3烧录pic18F45k80时,一直显 ...
- 找出 alter system kill session ‘sid,serial#’ kill 掉的数据库会话对应进程
当我们使用alter system kill session ‘sid,serial#’ 在数据库中kill掉某个会话的时候,如果你观察仔细会发现v$session.paddr发生了改变,从而是的不能 ...
- HDU 1667 The Rotation Game (A*迭代搜索)
题目大意:略 每次选择一个最大深度K,跑IDA* 估价函数H=8-中间8个格里出现次数最多的数的个数x,即把它填满这个数最少需要8-x次操作,如果dep+H>K,就跳出.. 深搜的时候暴力修改, ...
- 栈(stack)--c实现(使用双链表)
是不是直接贴代码不太好,我竟然不知道说什么. 写这个考虑的问题,或者是纠结的问题是这个头指针怎么处理,也就是栈的顶部,最后采用的是初始化第一个栈空间浪费掉,栈顶是有元素的.好像应该去学习下画图,没图不 ...
- CSS 清除浮动 伪类
参考链接:https://www.cnblogs.com/yingsu/p/7261904.html 不清楚浮动的结果和影响不再描述,清除浮动的代码别处也有很多,每种方法都有十分简洁的代码,我今天学到 ...
- caioj 1155 同余方程组(模版)
第一步,和同余方程一样,转化一下 两式相减得 这就转化为了求不定方程,用exgcd 求出x,要化成最小正整数解,避免溢出 然后可以求出P出来. 这个时候要把前两个式子转化成一个式子 设求出来的是P' ...
- poj2280--Amphiphilic Carbon Molecules(扫描线+极角排序+转换坐标)
题目链接:id=2280">点击打开链接 题目大意:给出n个点的坐标.每一个点有一个值0或者1,如今有一个隔板(无限长)去分开着n个点,一側统计0的个数,一側统计1的个数,假设点在板上 ...
- PForDelta的介绍论文
ttp://paperhub.s3.amazonaws.com/7558905a56f370848a04fa349dd8bb9d.pdf FOR(Frame-Of-Reference),PFor(Pa ...
- Objective-C对象与Core Foundation对象
Core Foundation 对象主要使用在用C语言编写的Core Foundation 框架中,并引用计数的对象.与Objective-C对象差别非常少.不管哪种框架生成的对象,一旦生成,便可在两 ...
- 有关Java基础的一些笔试题总结
针对近期腾讯.京东.网易等公司的笔试.遇到一些有关Java基础的问题,在此总结.希望能通过这几道经典问题题发散,举一反三.借此打牢基础! 自己总结,望提出宝贵意见! 一.关于null的一道小题 先开开 ...