题目来源:

点击打开链接

题目描述:

问题描述
小明和小芳出去乡村玩,小明负责开车,小芳来导航。
  小芳将可能的道路分为大道和小道。大道比较好走,每走1公里小明会增加1的疲劳度。小道不好走,如果连续走小道,小明的疲劳值会快速增加,连续走s公里小明会增加s2的疲劳度。
  例如:有5个路口,1号路口到2号路口为小道,2号路口到3号路口为小道,3号路口到4号路口为大道,4号路口到5号路口为小道,相邻路口之间的距离都是2公里。如果小明从1号路口到5号路口,则总疲劳值为(2+2)2+2+22=16+2+4=22。
  现在小芳拿到了地图,请帮助她规划一个开车的路线,使得按这个路线开车小明的疲劳度最小。
输入格式
输入的第一行包含两个整数n, m,分别表示路口的数量和道路的数量。路口由1至n编号,小明需要开车从1号路口到n号路口。
  接下来m行描述道路,每行包含四个整数t, a, b, c,表示一条类型为t,连接a与b两个路口,长度为c公里的双向道路。其中t为0表示大道,t为1表示小道。保证1号路口和n号路口是连通的。
输出格式
输出一个整数,表示最优路线下小明的疲劳度。
样例输入
6 7
1 1 2 3
1 2 3 2
0 1 3 30
0 3 4 20
0 4 5 30
1 3 5 6
1 5 6 1
样例输出
76
样例说明
从1走小道到2,再走小道到3,疲劳度为52=25;然后从3走大道经过4到达5,疲劳度为20+30=50;最后从5走小道到6,疲劳度为1。总共为76。
数据规模和约定
对于30%的评测用例,1 ≤ n ≤ 8,1 ≤ m ≤ 10;
  对于另外20%的评测用例,不存在小道;
  对于另外20%的评测用例,所有的小道不相交;
  对于所有评测用例,1 ≤ n ≤ 500,1 ≤ m ≤ 105,1 ≤ a, b ≤ n,t是0或1,c ≤ 105。保证答案不超过106

解题思路:

刚开始不懂做,因为有大路和小路,不能直接算,后来看了一个大神的博客,是把大路和小路分开,用两个dis数组去分别存储上条路是大路和小路,用spfa的算法,当本条路是大路,那他可以由大路转移过来,也可以由小路转移过来,如果是小路就只能由大路转移过来,因为用小路的最短路径可以先用floyd处理一下,然后比较两个dis数组的最小值就行。(不要忘了用long long。。。)

代码:

#include <iostream>
#include <cstring>
#include <string>
#include <queue>
#include <stack>
#include <vector>
#include <cmath>
#define inf 0x3f3f3f3f
using namespace std;
long long dl[505][505],xl[505][505];
long long dis1[505],dis2[505];
bool jl[505],vis[505];
int n,m;
void floyd()//预处理小路
{for(int k=1;k<=n;k++)for(int i=1;i<=n;i++)for(int j=1;j<=n;j++){if(xl[i][j]>xl[i][k]+xl[k][j]&&xl[i][k]!=inf&&xl[k][j]!=inf){xl[i][j]=xl[i][k]+xl[k][j];}}
}
int main()
{memset(xl,inf,sizeof(xl));memset(dl,inf,sizeof(dl));cin>>n>>m;for(int i=1;i<=m;i++){int a,b,c,d;cin>>a>>b>>c>>d;if(a==1&&xl[b][c]>d){xl[b][c]=xl[c][b]=d;}else if(a==0&&dl[b][c]>d){dl[b][c]=dl[c][b]=d;}}floyd();memset(dis1,inf,sizeof(dis1));memset(dis2,inf,sizeof(dis2));queue<int>q;dis1[1]=dis2[1]=0;q.push(1);vis[1]=1;while(!q.empty()){int now=q.front();q.pop();vis[now]=0;for(int i=1;i<=n;i++){long long v=dl[now][i];if(dis1[i]>dis1[now]+v)//大路加大路{dis1[i]=dis1[now]+v;if(vis[i])continue;vis[i]=1;q.push(i);}if(dis1[i]>dis2[now]+v)//大路加小路{dis1[i]=dis2[now]+v;if(vis[i])continue;vis[i]=1;q.push(i);}if(xl[now][i]<1e10){v=xl[now][i]*xl[now][i];if(dis2[i]>dis1[now]+v)//小路加大路{dis2[i]=dis1[now]+v;if(vis[i])continue;vis[i]=1;q.push(i);}}}}cout<<min(dis1[n],dis2[n])<<endl;return 0;}

CCF-CSP—2017.12.—4 行车路线(spfa) 题解相关推荐

  1. CSP 201712 - 4 【行车路线】

    文章目录 一.问题描述 二.实现代码 总结 一.问题描述 小明和小芳出去乡村玩,小明负责开车,小芳来导航. 小芳将可能的道路分为大道和小道.大道比较好走,每走1公里小明会增加1的疲劳度.小道不好走,如 ...

  2. CSP认证201712-4 行车路线[C++题解]:单源最短路变型、拆点、好题!

    文章目录 题目解答 题目链接 题目解答 来源:acwing 分析: 题目给定所有答案不超过1e6,其实也就保证了连续小路的长度不超过1000(1000的平方就是1e6).这样我们就可以在题目给定的条件 ...

  3. CCF CSP 行车路线 java 201712_4

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

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

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

  5. CSP 201712-4 行车路线(100)

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

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

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

  7. CCF:201712-4 行车路线

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

  8. CCF 行车路线 100分

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

  9. 行车路线(改)(图的应用)

    写在前面:仅为个人代码/总结,未必标准,仅供参考!如有错误,还望指出交流,共同进步! 行车路线 [问题描述] 小明和小芳出去乡村玩,小明负责开车,小芳来导航. 小芳将可能的道路分为大道和小道.大道比较 ...

最新文章

  1. 利用Windows Server Backup备份数据进行域控裸机还原
  2. c语言如何如何入门,程序员C语言新手如何入门?
  3. List 在迭代时可能抛出的异常
  4. 深度思考 Spring Cloud + Alibaba Sentinel 源码原理
  5. 产品经理面试题目转载
  6. xshell 5的使用教程
  7. 鸡兔同笼php编程,C语言鸡兔同笼问题
  8. JAVA:代码实现zip压缩
  9. 【渝粤教育】广东开放大学 经济法基础 形成性考核 (52)
  10. SAP MM ME21N 创建PO时报错 - Net price in CNY becomes too large –
  11. Dlib模型之驾驶员疲劳检测总结(可视化界面)
  12. 【综合评价方法 熵权法】指标权重确定方法之熵权法
  13. 一对一视频直播系统开源一对一视频交友源码程序
  14. C语言实现wav文件的读写
  15. cocos creator中FBX文件不可用显示asset invalid
  16. Vue3 企业级网站建设
  17. 支持加密的开源笔记Joplin
  18. 查看当前系统安装的字体
  19. Dreammail 常见问题
  20. 【17】报错Failed to allocate graph: MYRIAD device is not opened.

热门文章

  1. 时光音乐会mp3全集
  2. Android开发已经到了要烧香求职的地步了?
  3. JAVA 的性能优化
  4. 1.2(redis)5大数据结构
  5. IIS 部署php程序
  6. 广工计算机组成原理考试,广工计算机组成原理期末考试B卷(杨卫平)
  7. 10.1 快乐,自费送几本豆瓣9.0高分书籍
  8. 2.zookeeper客户端使用与集群特性
  9. C# 总结ManualResetEvent与AutoResetEvent【一】
  10. 湖北省钟祥一中2021高考成绩查询,钟祥2021中考分数线查询