CCF 201712-4 行车路线
解题思路
- 这题要求点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 行车路线相关推荐
- CCF认证 201712-4 行车路线(100分)
CCF认证 201712-4 行车路线 思路:好难啊,去学习大佬的解法了,结果吭吭哧哧的还出现很多不bug.首先用的是是spfa的算法.但是由于处理小路的时候用来floyd,所以这个时间复杂度也不小, ...
- CCF:201712-4 行车路线
试题编号: 201712-4 试题名称: 行车路线 时间限制: 1.0s 内存限制: 256.0MB 问题描述: 问题描述 小明和小芳出去乡村玩,小明负责开车,小芳来导航. 小芳将可能的道路分为大道和 ...
- CCF考试——201712-4行车路线
概要 问题描述 小明和小芳出去乡村玩,小明负责开车,小芳来导航. 小芳将可能的道路分为大道和小道.大道比较好走,每走1公里小明会增加1的疲劳度.小道不好走,如果连续走小道,小明的疲劳值会快速增加,连续 ...
- ccf认证 201712-4行车路线(100分)
题目: 问题描述 小明和小芳出去乡村玩,小明负责开车,小芳来导航. 小芳将可能的道路分为大道和小道.大道比较好走,每走1公里小明会增加1的疲劳度.小道不好走,如果连续走小道,小明的疲劳值会快速增加,连 ...
- 【CCF 201712-4】行车路线(Dijkstra 80分)
忽略一个条件:可能具有连续的小路,跑一边裸的迪杰斯特拉算法,即可拿到80分 注意:边权可能会爆int,采用long long才可以 #include <iostream> #include ...
- CCF CSP 行车路线 java 201712_4
CCF CSP 行车路线 java 201712_4 问题描述 小明和小芳出去乡村玩,小明负责开车,小芳来导航. 小芳将可能的道路分为大道和小道.大道比较好走,每走1公里小明会增加1的疲劳度.小道不好 ...
- CCF 行车路线 100分
试题编号: 201712-4 试题名称: 行车路线 时间限制: 1.0s 内存限制: 256.0MB 问题描述: 问题描述 小明和小芳出去乡村玩,小明负责开车,小芳来导航. 小芳将可能的道路分为大道和 ...
- CSP第十二次认证 行车路线 拆点
这道题的关键是如何解决连续小路的情况,因为题目保证答案不超过1e6,说明小路的连续长度不超过1000,给了我们提示,可以将点拆分为两个属性,一个是点的序号,另一个则是最后一段连续小路的长度,所以我们的 ...
- CCF201712-4 行车路线(最短路)
试题编号: 201712-4 试题名称: 行车路线 时间限制: 1.0s 内存限制: 256.0MB 问题描述: 问题描述 小明和小芳出去乡村玩,小明负责开车,小芳来导航. 小芳将可能的道路分为大道和 ...
- 如何在Apple Watch上获取行车路线
Kevin Parrish 凯文·帕里什 Gone are the days of using paper maps to navigate unknown roads and cities. Now ...
最新文章
- iOS 界面上绘制不同字体 颜色 大小的字符串
- php gd库画线,[PHP] GD库(十)绘制线段与圆弧 imageline、imagesetstyle 与 imagearc 函数...
- 向net core 3.0进击——April.WebApi从2.2爬到3.0
- oracle手动注册数据库,Oracle 11g手动创建数据库(Linux平台)
- c语言全文件操作函数,C语言文件操作函数大全
- 【20161108】总结
- CompoundButton(checkbox,switch,ToggleButton)和RadioGroup OnCheckedChangeListener() 引用冲突问题
- 记录下hbuilderX+vue开发app 真机调试的问题
- zeros函数和ones函数的用法
- 资金合规结算——聚焦银行内部两种不同账户
- snubber电路总结
- nginx设置cookie
- Discuz论坛简单搭建
- java 变量共享_Java并发编程之共享变量
- TypeError: unbound method a() must be called with A instance as first argument (got nothing instead)
- Socialbook告诉你这才是KOL营销的终极秘诀
- 智慧灯杆基于边缘计算网关的单灯远程控制功能
- 狂神说Java Linux笔记三(Vim使用及账号用户管理和进程)
- KindEditor图片空间增加图片删除功能
- Harmony No.4
热门文章
- 工作中遇到的问题总结
- 原创|我为什么不建议你等公司倒闭后,再找工作!
- git提交到github
- Intellij IDEA如何设置为中文界面?
- VSCode更新到1.42.1版本有问题(January 2020 (version 1.42))
- itools官方中文版2014 v2.0.3.8_苹果同步软件
- Windows的cmd中cd指令切换路径
- 关于oracle数据库死锁的解决 以及产生的原因
- java连接qq邮箱_Java使用qq邮箱发邮件实现
- 第8章第14节:制作企业宣传册的公司团队第一页面 [PowerPoint精美幻灯片实战教程]