思路

难点在于 大小路的混合, 连续走 小路时 L1,L2,产生的疲劳值为(L1+L2)的平方,而不是 (L1 的平方 +L2 的平方)

解决思路
把大路和小路分开在两张图上考虑,由于小路的疲劳值为连续计算在平方,所以先用Floyd算法 计算小路图 上,小路所连接的每个可到达点的 距离 ;

这个举个例子: 例如 已知小路 1—>2权值 a, 2---->4 权值 b ,此时可以处理出 小路 1—>4 的 权值 a+b
这样解决了 计算1 到4时 连续走小路 的距离为 pow(a+b,2) ,不会错误的算成pow(a,2)+pow(b,2);

之后用spfa算法跑图
关键思路:每一步所走的路只有3种
#1. 从大路到大路
#2.从小路到大路
#3.从大路到小路
注意 ,没有从小路的小路的情况(仔细思考这一点,我想了很久),因为 前面用Floyd 处理了 小路图
dis【i】记录 从大路到 i 点 的 最短路
dis0【i】记录从小路到 i 点的 最短路

#坑点:
1.感觉数据不是很大,但会爆 int
2.有重边 :网上有用vector 处理 ,我通过 更新重边 处理 (具体见代码)

温馨提示:
跑图的时候网上有人用迪杰斯特拉dijkstra() ,虽然也能100分 ,但大多因为数据水, 有很多通不过的样例

在这里插入代码片
#include <iostream>
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=505;
const ll inf=0x3f3f3f3f3f3f3f3f;   // long long 最大值的初始化ll v[N][N],v0[N][N];   //  邻接矩阵  v 记录大路,v0 记录小路;ll dis[N],dis0[N];    //dis 记录大路到达i点的距离 ,dis0 记录小路到达i点的距离bool vis[N];  // 判断顶点i是否入队ll n,m,flag,c,a,b;
queue<int >q;
void spfa(int first)
{memset(vis,false,sizeof(vis));memset(dis0,inf,sizeof(dis0));memset(dis,inf,sizeof(dis));dis[first]=0;   // 起点的更新dis0[first]=0;q.push(first);vis[first]=true;int   u;// ll cost=0;while(!q.empty()){u=q.front();q.pop();vis[u]=false;for(int i=1; i<=n; i++){if(v[u][i]+dis[u]<dis[i])  // 从大路走向大路     更新大路;{dis[i]=dis[u]+v[u][i];if(!vis[i])       // 该点未放入队列时,则放入{q.push(i);vis[i]=true;    //放入后打上标记,// 当i在队列中,其他顶点走到i是,只更新dis 而不再次放入队列}}if(v[u][i]+dis0[u]<dis[i])   //从小路走向大路,到达i点 ,更新大路;{dis[i]=dis0[u]+v[u][i];if(!vis[i]){q.push(i);vis[i]=true;}}if(v0[u][i]!=inf)    //当小路可以走{if(v0[u][i]*v0[u][i]+dis[u]<dis0[i])     //从大路走向小路,  更新小路{dis0[i]=v0[u][i]*v0[u][i]+dis[u];if(!vis[i]){q.push(i);vis[i]=true;}}}}}
}
int main()
{scanf("%lld %lld",&n,&m);memset(v,inf,sizeof(v));      // 邻接矩阵的初始化memset(v0,inf,sizeof(v0));for(int i=1; i<=m; i++){scanf("%lld %lld %lld %lld",&flag,&a,&b,&c);if(flag&&c<v0[a][b])     // 因为有重边,所以要更新比较权值{v0[a][b]=c;v0[b][a]=c;}if(!flag&&c<v[a][b]){v[a][b]=c;v[b][a]=c;}}for(int i=1; i<=n; i++)  //  floyd  更新小路,将小路可到达的可到达的点的权值都求出for(int j=i+1; j<=n; j++){for(int k=1; k<=n; k++){if(k==i||k==j)continue;if(v0[i][k]+v0[k][j]<v0[i][j]){v0[i][j]=v0[i][k]+v0[k][j];v0[j][i]=v0[i][j];}}}spfa(1);printf("%lld\n",min(dis0[n],dis[n]));  //  最后到达 n点时 ,可能走大路,也可能走小路 ,故输出最小值;return 0;}

推荐几个博客,大家可以向大佬学习一下:
ccf大佬

https://blog.csdn.net/Miranda_ymz/article/details/85016128

CCF 201712-4 行车路线(100分)相关推荐

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

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

  2. CCF 行车路线 100分

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

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

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

  4. ccf 201612-3 权限查询(100分)

    问题描述 授权 (authorization) 是各类业务系统不可缺少的组成部分,系统用户通过授权机制获得系统中各个模块的操作权限. 本题中的授权机制是这样设计的:每位用户具有若干角色,每种角色具有若 ...

  5. CCF:201712-4 行车路线

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

  6. ccf 201703-4 地铁修建(100分)

    问题描述 A市有n个交通枢纽,其中1号和n号非常重要,为了加强运输能力,A市决定在1号到n号枢纽间修建一条地铁. 地铁由很多段隧道组成,每段隧道连接两个交通枢纽.经过勘探,有m段隧道作为候选,两个交通 ...

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

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

  8. CCF之地铁修建(100分)

    问题描述 A市有n个交通枢纽,其中1号和n号非常重要,为了加强运输能力,A市决定在1号到n号枢纽间修建一条地铁. 地铁由很多段隧道组成,每段隧道连接两个交通枢纽.经过勘探,有m段隧道作为候选,两个交通 ...

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

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

  10. CCF认证考试 202012-5星际旅行 (100分)(线段树)

    题目描述 传送门: 星际旅行 思路 根据题目描述,这道题显然是一道线段树的模板题.动力加和动力增强用对应线段树的区间加和区间乘操作.关键是旋转操作,回忆一下,线段树的区间加和区间乘都有对应的懒标记,而 ...

最新文章

  1. android builder模式 插件,如何在Kotlin中实现Builder模式?
  2. 老BOJ 11 Counting
  3. 聊聊 computed 影响性能的场景
  4. 解读Mybatis数据库开发框架
  5. QT 定时关机、共享内存、启动浏览器、浏览器前进后退刷新、进度条、设置浏览器标题、QML入门
  6. 通过日志审计追踪外部***
  7. 牛客NOIP暑期七天营-普及组1 解题报告
  8. minecraftjava版光追_我的世界:光追技术终于开始测试?没想到网易版已更新狐狸生物?...
  9. 谋学网计算机维修,19秋学期西交《计算机组成原理》在线作业1(标准答案).doc...
  10. 大数据产品价值主张_大数据对商业模式创新的影响
  11. PART 1:基于大数据人才岗位招聘情况对数据进行清洗、初步分析
  12. 电商设计师如何正确认知自己的价值
  13. windows简单命令
  14. SSH登录出现REMOTE HOST IDENTIFICATION HAS CHANGED故障的解决办法
  15. log4j和slf4j的区别
  16. vue 流星的样式和流光canvas
  17. Error Code: 1318. Incorrect number of arguments for PROCEDURE student.new_procedure; expected 0, got
  18. 工作室转型做什么好项目?
  19. 2020年全球权威机器人评选RBR50放榜:中国仅一家公司入选,大疆落榜
  20. Chicken for Windows Phone

热门文章

  1. 鸿蒙系统(HarmonyOS)-- 第2章:鸿蒙Ul框架
  2. 苹果手机代数_讲知识:苹果手机已十年 命名规则多幻变
  3. 51单片机(2):最小系统
  4. Java选择题(八)
  5. 【译】第十篇 Integration Services:高级事件行为
  6. 牛逼,一份基于SSM框架实现的支付宝支付功能,附完整源代码...
  7. 微信点击链接直接下载安装包功能实现方式
  8. 安装 CC2531 USB Dongle(驱动精灵)
  9. 计算机应用基础差错解释,计算机应用基础名词解释:差错
  10. 一分钟用HCaas搭建Frp内网穿透