解题思路

  • 这题要求点1到点n开车疲劳度最小,显然可以和最短路径联系在一起。我是直接用Dijkstra求解,基于贪心的想法,遍历某个已经确定最短的点时①若下一条边为大路②若下一条边为小路,且最短点由小路走来③若下一条边为小路,且最短点由大路走来。分三步逐渐遍历。
  • 需要注意的是,上面这个想法不完全正确…但CCF上能100分通过…,我看到有人在讨论时提到数据比如4 4 1 1 2 5 1 2 3 5 0 1 3 121 1 3 4 10的时候,答案应该是221,但我的解输出的是400。
  • 若要完全解答,我个人认为在贪心逐一记录每个点的最短路时,可以记录该点由小路走来的最短路和由大路走来的最短路,即对于每个点的最短路,要分开看①上一条路是大路②上一条路是小路。这样便能解决上面那个问题。

下面是我CCF上100分的代码,但正如之前所说的,不完全正确…不过也不怎么想改了…

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<vector>
#include<queue>
#include<cstring>
#define ll long long
using namespace std;const int maxn=500+10;
const int maxm=100000+10;
int n,m;
struct Edge{int from,to,p;ll dis;Edge(int f,int t,ll d,int p):from(f),to(t),dis(d),p(p){}
};
struct Node{ll d;int u;Node(int u=0,ll d=0):u(u),d(d){}   bool operator<(const Node a)const{return d>a.d;}
};
struct D{int p;ll dis,cnt;D(ll dis=0,int p=0,ll cnt=0):dis(dis),p(p),cnt(cnt){}
};
int vis[maxn];
vector<int> G[maxn];
vector<Edge> edges;
D d[maxn];void Add(int u,int v,ll d,int p){edges.push_back(Edge(u,v,d,p));edges.push_back(Edge(v,u,d,p));int k=edges.size();G[u].push_back(k-2);G[v].push_back(k-1);
}void Dijkstra(){for(int i=1;i<=n;i++){d[i].dis=1<<30;d[i].p=0;d[i].cnt=0;}d[1].dis=0;memset(vis,0,sizeof(vis));priority_queue<Node> pq;pq.push(Node(1,0));while(!pq.empty()){Node p=pq.top();pq.pop();int u=p.u;if(vis[u]) continue;vis[u]=1;for(int i=0;i<G[u].size();i++){Edge e=edges[G[u][i]];int v=e.to;Node t;t.u=v;if(e.p==0){ //若该边是大道    if(d[v].dis > d[u].dis+e.dis){t.d=d[u].dis+e.dis ; d[v].dis=t.d;d[v].p=0;d[v].cnt=0;pq.push(t);}}else{ //若该边是小道 if(d[u].p==1){ //若上一点是从小道过来 t.d=d[u].dis - d[u].cnt*d[u].cnt + (d[u].cnt+e.dis)*(d[u].cnt+e.dis);if(t.d<d[v].dis){d[v].dis=t.d;d[v].p=1;d[v].cnt=d[u].cnt+e.dis;pq.push(t);}}else{ //若上一点从大道过来 if(d[v].dis > d[u].dis+e.dis*e.dis ){t.d=d[u].dis+e.dis*e.dis ;d[v].dis=t.d;d[v].p=1;d[v].cnt=e.dis;pq.push(t);}}}}}
}int main(){scanf("%d %d",&n,&m);for(int i=0;i<m;i++){int p,u,v;ll d;scanf("%d %d %d %lld",&p,&u,&v,&d);Add(u,v,d,p);}Dijkstra();printf("%lld",d[n].dis);return 0;
}

CCF 201712-4 行车路线相关推荐

  1. CCF认证 201712-4 行车路线(100分)

    CCF认证 201712-4 行车路线 思路:好难啊,去学习大佬的解法了,结果吭吭哧哧的还出现很多不bug.首先用的是是spfa的算法.但是由于处理小路的时候用来floyd,所以这个时间复杂度也不小, ...

  2. CCF:201712-4 行车路线

    试题编号: 201712-4 试题名称: 行车路线 时间限制: 1.0s 内存限制: 256.0MB 问题描述: 问题描述 小明和小芳出去乡村玩,小明负责开车,小芳来导航. 小芳将可能的道路分为大道和 ...

  3. CCF考试——201712-4行车路线

    概要 问题描述 小明和小芳出去乡村玩,小明负责开车,小芳来导航. 小芳将可能的道路分为大道和小道.大道比较好走,每走1公里小明会增加1的疲劳度.小道不好走,如果连续走小道,小明的疲劳值会快速增加,连续 ...

  4. ccf认证 201712-4行车路线(100分)

    题目: 问题描述 小明和小芳出去乡村玩,小明负责开车,小芳来导航. 小芳将可能的道路分为大道和小道.大道比较好走,每走1公里小明会增加1的疲劳度.小道不好走,如果连续走小道,小明的疲劳值会快速增加,连 ...

  5. 【CCF 201712-4】行车路线(Dijkstra 80分)

    忽略一个条件:可能具有连续的小路,跑一边裸的迪杰斯特拉算法,即可拿到80分 注意:边权可能会爆int,采用long long才可以 #include <iostream> #include ...

  6. CCF CSP 行车路线 java 201712_4

    CCF CSP 行车路线 java 201712_4 问题描述 小明和小芳出去乡村玩,小明负责开车,小芳来导航. 小芳将可能的道路分为大道和小道.大道比较好走,每走1公里小明会增加1的疲劳度.小道不好 ...

  7. CCF 行车路线 100分

    试题编号: 201712-4 试题名称: 行车路线 时间限制: 1.0s 内存限制: 256.0MB 问题描述: 问题描述 小明和小芳出去乡村玩,小明负责开车,小芳来导航. 小芳将可能的道路分为大道和 ...

  8. CSP第十二次认证 行车路线 拆点

    这道题的关键是如何解决连续小路的情况,因为题目保证答案不超过1e6,说明小路的连续长度不超过1000,给了我们提示,可以将点拆分为两个属性,一个是点的序号,另一个则是最后一段连续小路的长度,所以我们的 ...

  9. CCF201712-4 行车路线(最短路)

    试题编号: 201712-4 试题名称: 行车路线 时间限制: 1.0s 内存限制: 256.0MB 问题描述: 问题描述 小明和小芳出去乡村玩,小明负责开车,小芳来导航. 小芳将可能的道路分为大道和 ...

  10. 如何在Apple Watch上获取行车路线

    Kevin Parrish 凯文·帕里什 Gone are the days of using paper maps to navigate unknown roads and cities. Now ...

最新文章

  1. iOS 界面上绘制不同字体 颜色 大小的字符串
  2. php gd库画线,[PHP] GD库(十)绘制线段与圆弧 imageline、imagesetstyle 与 imagearc 函数...
  3. 向net core 3.0进击——April.WebApi从2.2爬到3.0
  4. oracle手动注册数据库,Oracle 11g手动创建数据库(Linux平台)
  5. c语言全文件操作函数,C语言文件操作函数大全
  6. 【20161108】总结
  7. CompoundButton(checkbox,switch,ToggleButton)和RadioGroup OnCheckedChangeListener() 引用冲突问题
  8. 记录下hbuilderX+vue开发app 真机调试的问题
  9. zeros函数和ones函数的用法
  10. 资金合规结算——聚焦银行内部两种不同账户
  11. snubber电路总结
  12. nginx设置cookie
  13. Discuz论坛简单搭建
  14. java 变量共享_Java并发编程之共享变量
  15. TypeError: unbound method a() must be called with A instance as first argument (got nothing instead)
  16. Socialbook告诉你这才是KOL营销的终极秘诀
  17. 智慧灯杆基于边缘计算网关的单灯远程控制功能
  18. 狂神说Java Linux笔记三(Vim使用及账号用户管理和进程)
  19. KindEditor图片空间增加图片删除功能
  20. Harmony No.4

热门文章

  1. 工作中遇到的问题总结
  2. 原创|我为什么不建议你等公司倒闭后,再找工作!
  3. git提交到github
  4. Intellij IDEA如何设置为中文界面?
  5. VSCode更新到1.42.1版本有问题(January 2020 (version 1.42))
  6. itools官方中文版2014 v2.0.3.8_苹果同步软件
  7. Windows的cmd中cd指令切换路径
  8. 关于oracle数据库死锁的解决 以及产生的原因
  9. java连接qq邮箱_Java使用qq邮箱发邮件实现
  10. 第8章第14节:制作企业宣传册的公司团队第一页面 [PowerPoint精美幻灯片实战教程]