题目描述

“那是一条神奇的天路诶~,把第一个神犇送上天堂~”,XDM先生唱着这首“亲切”的歌曲,一道猥琐题目的灵感在脑中出现了。

和C_SUNSHINE大神商量后,这道猥琐的题目终于出现在本次试题上了,旨在难到一帮大脑不够灵活的OIer们(JOHNKRAM真的不是说你……)。

言归正传,小X的梦中,他在西藏开了一家大型旅游公司,现在,他要为西藏的各个景点设计一组铁路线。但是,小X发现,来旅游的游客都很挑剔,他们乘火车在各个景点间游览,景点的趣味当然是不用说啦,关键是路上。试想,若是乘火车一圈转悠,却发现回到了游玩过的某个景点,花了一大堆钱却在路上看不到好的风景,那是有多么的恼火啊。

所以,小X为所有的路径定义了两个值,Vi和Pi,分别表示火车线路的风景趣味度和乘坐一次的价格。现在小X想知道,乘客从任意一个景点开始坐火车走过的一条回路上所有的V之和与P之和的比值的最大值。以便为顾客们推荐一条环绕旅游路线(路线不一定包含所有的景点,但是不可以存在重复的火车路线)。

于是,小X梦醒之后找到了你……

输入输出格式

输入格式:

第一行两个正整数N,M,表示有N个景点,M条火车路线,火车路线是单向的。

以下M行,每行4个正整数,分别表示一条路线的起点,终点,V值和P值。

注意,两个顶点间可能有多条轨道,但一次只能走其中的一条。

输出格式:

一个实数,表示一条回路上最大的比值,保留1位小数。

若没有回路,输出-1。

输入输出样例

输入样例#1:

  1. 5 6
  2. 1 2 1 1
  3. 4 1 6 2
  4. 5 4 8 1
  5. 2 3 2 2
  6. 5 2 4 1
  7. 3 5 6 4
输出样例#1:

  1. 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分。

  1. #include<deque>
  2. #include<cstdio>
  3. #include<cstring>
  4. #include<iostream>
  5. #include<algorithm>
  6. #define MAXN 50010
  7. using namespace std;
  8. int n,m,tot;
  9. double l,r,mid;
  10. double intrest[MAXN],cap[MAXN],dis[MAXN];
  11. int to[MAXN],head[MAXN],net[MAXN],vis[MAXN],num[MAXN];
  12. inline int read(){
  13. char ch=getchar();int data=;
  14. while(ch<''||ch>'') ch=getchar();
  15. do{
  16. data=data*+ch-'';
  17. ch=getchar();
  18. }while(ch>='' && ch<='');
  19. return data;
  20. }
  21. inline void add(int u,int v,double w,double p){
  22. to[++tot]=v;net[tot]=head[u];intrest[tot]=w;cap[tot]=p;head[u]=tot;
  23. }
  24. inline bool spfa(int s){
  25. deque<int>que;
  26. memset(vis,,sizeof(vis));
  27. memset(num,,sizeof(num));
  28. memset(dis,0x7f,sizeof(dis));
  29. que.push_back(s);
  30. dis[s]=;vis[s]=;num[s]++;
  31. while(!que.empty()){
  32. int now=que.front();
  33. que.pop_front();
  34. vis[now]=;
  35. for(int i=head[now];i;i=net[i])
  36. if(dis[to[i]]>dis[now]+mid*cap[i]-intrest[i]){
  37. dis[to[i]]=dis[now]+mid*cap[i]-intrest[i];
  38. if(!vis[to[i]]){
  39. if(dis[to[i]]>dis[now]) que.push_back(to[i]);
  40. else que.push_front(to[i]);
  41. vis[to[i]]=;
  42. num[to[i]]++;
  43. if(num[to[i]]>n) return true;
  44. }
  45. }
  46. }
  47. return false;
  48. }
  49. inline bool check(double x){
  50. if(spfa()) return true;
  51. else return false;
  52. }
  53. int main(){
  54. n=read();m=read();
  55. for(int i=;i<=m;i++){
  56. int x,y;double v,p;
  57. x=read();y=read();
  58. scanf("%lf%lf",&v,&p);
  59. add(x,y,v,p);
  60. }
  61. for(int i=;i<=n;i++) add(,i,,);
  62. l=;r=;
  63. while(r-l>0.01){
  64. mid=(l+r)/;
  65. if(check(mid)) l=mid;
  66. else r=mid;
  67. }
  68. if(l==) cout<<"-1";
  69. else printf("%.1lf",r);
  70. }

bfs的spfa判负环

dfs判负环AC    19ms

  1. #include<deque>
  2. #include<cstdio>
  3. #include<cstring>
  4. #include<iostream>
  5. #include<algorithm>
  6. #define MAXN 50010
  7. using namespace std;
  8. int n,m,tot;
  9. double l,r,mid,ans;
  10. double intrest[MAXN],cap[MAXN],dis[MAXN];
  11. int to[MAXN],head[MAXN],net[MAXN],vis[MAXN];
  12. inline void add(int u,int v,double w,double p){
  13. to[++tot]=v;net[tot]=head[u];intrest[tot]=w;cap[tot]=p;head[u]=tot;
  14. }
  15. bool spfa(int now){
  16. vis[now]=;
  17. for(int i=head[now];i;i=net[i])
  18. if(dis[to[i]]>dis[now]+mid*cap[i]-intrest[i]){
  19. dis[to[i]]=dis[now]+mid*cap[i]-intrest[i];
  20. if(vis[to[i]]||spfa(to[i])){
  21. vis[to[i]]=;
  22. return true;
  23. }
  24. }
  25. vis[now]=;
  26. return false;
  27. }
  28. inline bool check(double x){
  29. for(int i=;i<=n;i++)
  30. if(spfa(i)) return true;
  31. return false;
  32. }
  33. int main(){
  34. scanf("%d%d",&n,&m);
  35. for(int i=;i<=m;i++){
  36. int x,y;double v,p;
  37. scanf("%d%d",&x,&y);
  38. scanf("%lf%lf",&v,&p);
  39. add(x,y,v,p);
  40. }
  41. l=;r=;
  42. while(r-l>0.01){
  43. mid=(l+r)/;
  44. if(check(mid)){
  45. ans=mid;
  46. l=mid;
  47. }
  48. else r=mid;
  49. }
  50. if(l==) cout<<"-1";
  51. else printf("%.1lf",ans);
  52. }

对比一下spfa的bfs判负环和dfs判负环的时间复杂度:

这些是bfs的尽管加上了各种优化还以一直TLE

而下面的:

  第一行是没加读入优化的dfs。

  第二行是加上读入优化的dfs。

dfs的速度秒杀bfs

浴谷 P1768 天路的更多相关文章

  1. 洛谷 P1768 天路

    P1768 天路 题目描述 “那是一条神奇的天路诶~,把第一个神犇送上天堂~”,XDM先生唱着这首“亲切”的歌曲,一道猥琐题目的灵感在脑中出现了. 和C_SUNSHINE大神商量后,这道猥琐的题目终于 ...

  2. 浴谷夏令营例题Codeforces827DBest Edge Weight(三个愿望,一次满足~(大雾

    这题在浴谷夏令营wyx在讲的最小生成树的时候提到过,但并没有细讲怎么写... 这题可以用三种写法写,虽然只有两种能过...(倍增/倍增+并查集/树链剖分 先跑出最小生成树,分类讨论,在MST上的边,考 ...

  3. [P1768]天路(分数规划+SPFA判负环)

    题目描述 “那是一条神奇的天路诶~,把第一个神犇送上天堂~”,XDM先生唱着这首“亲切”的歌曲,一道猥琐题目的灵感在脑中出现了. 和C_SUNSHINE大神商量后,这道猥琐的题目终于出现在本次试题上了 ...

  4. Luogu P1768 天路 0/1分数规划+dfs spfa

    “那是一条神奇的天路诶~~把第一个神犇送上天堂” 怕不是某大佬早就A了这题,然鹅我又调了很久很久... 好吧就是0/1分数规划,但是跑的dfs的spfa(好像题解说bfs过不了????不知) 发现把s ...

  5. 浴谷八连测R6题解(收获颇丰.jpg)

    这场的题都让我收获颇丰啊QWQ 感谢van♂老师 T1 喵喵喵!当时以为经典题只能那么做, 思维定势了... 因为DP本质是通过一些条件和答案互相递推的一个过程, 实际上就是把条件和答案分配在DP的状 ...

  6. 浴谷八连测R4题解

    一开始出了点bug能看见排行榜,于是我看见我半个小时就A掉了前两题,信心场QAQ T1字符串题就不说了qwq #include<iostream> #include<cstring& ...

  7. 洛谷10月月赛R2·浴谷八连测R3题解

    早上打一半就回家了... T1傻逼题不说了...而且我的写法比题解要傻逼很多T T T2可以发现,我们强制最大值所在的块是以左上为边界的倒三角,然后旋转4次就可以遍历所有的情况.所以二分极差,把最大值 ...

  8. 浴谷金秋线上集训营 T11738 伪神(树链剖分)

    先树链剖分,一棵子树的编号在数组上连续,一条链用树链剖分,把这些线段全部取出来,做差分,找到有多少点被>=t条线段覆盖即可. #include<iostream> #include& ...

  9. luogu P1768 天路

    嘟嘟嘟 01分数规划之最优比率环. 主要是发一下基于dfs的spfa.跑的贼快,原来总用时2000多ms还TLE了两个点,改成dfs后总用时直降43ms! #include<cstdio> ...

随机推荐

  1. PIC kit3问题

    1.通过pic kit3烧录pic16F1938的时候,pic kit3自动更新了firmware,但是仍然烧录不了pic16F1938,然后再次用pic kit3烧录pic18F45k80时,一直显 ...

  2. 找出 alter system kill session ‘sid,serial#’ kill 掉的数据库会话对应进程

    当我们使用alter system kill session ‘sid,serial#’ 在数据库中kill掉某个会话的时候,如果你观察仔细会发现v$session.paddr发生了改变,从而是的不能 ...

  3. HDU 1667 The Rotation Game (A*迭代搜索)

    题目大意:略 每次选择一个最大深度K,跑IDA* 估价函数H=8-中间8个格里出现次数最多的数的个数x,即把它填满这个数最少需要8-x次操作,如果dep+H>K,就跳出.. 深搜的时候暴力修改, ...

  4. 栈(stack)--c实现(使用双链表)

    是不是直接贴代码不太好,我竟然不知道说什么. 写这个考虑的问题,或者是纠结的问题是这个头指针怎么处理,也就是栈的顶部,最后采用的是初始化第一个栈空间浪费掉,栈顶是有元素的.好像应该去学习下画图,没图不 ...

  5. CSS 清除浮动 伪类

    参考链接:https://www.cnblogs.com/yingsu/p/7261904.html 不清楚浮动的结果和影响不再描述,清除浮动的代码别处也有很多,每种方法都有十分简洁的代码,我今天学到 ...

  6. caioj 1155 同余方程组(模版)

    第一步,和同余方程一样,转化一下 两式相减得 这就转化为了求不定方程,用exgcd 求出x,要化成最小正整数解,避免溢出 然后可以求出P出来. 这个时候要把前两个式子转化成一个式子 设求出来的是P' ...

  7. poj2280--Amphiphilic Carbon Molecules(扫描线+极角排序+转换坐标)

    题目链接:id=2280">点击打开链接 题目大意:给出n个点的坐标.每一个点有一个值0或者1,如今有一个隔板(无限长)去分开着n个点,一側统计0的个数,一側统计1的个数,假设点在板上 ...

  8. PForDelta的介绍论文

    ttp://paperhub.s3.amazonaws.com/7558905a56f370848a04fa349dd8bb9d.pdf FOR(Frame-Of-Reference),PFor(Pa ...

  9. Objective-C对象与Core Foundation对象

    Core Foundation 对象主要使用在用C语言编写的Core Foundation 框架中,并引用计数的对象.与Objective-C对象差别非常少.不管哪种框架生成的对象,一旦生成,便可在两 ...

  10. 有关Java基础的一些笔试题总结

    针对近期腾讯.京东.网易等公司的笔试.遇到一些有关Java基础的问题,在此总结.希望能通过这几道经典问题题发散,举一反三.借此打牢基础! 自己总结,望提出宝贵意见! 一.关于null的一道小题 先开开 ...