CCF 201712-4 行车路线(100分)
思路
难点在于 大小路的混合, 连续走 小路时 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分)相关推荐
- ccf认证 201712-4行车路线(100分)
题目: 问题描述 小明和小芳出去乡村玩,小明负责开车,小芳来导航. 小芳将可能的道路分为大道和小道.大道比较好走,每走1公里小明会增加1的疲劳度.小道不好走,如果连续走小道,小明的疲劳值会快速增加,连 ...
- CCF 行车路线 100分
试题编号: 201712-4 试题名称: 行车路线 时间限制: 1.0s 内存限制: 256.0MB 问题描述: 问题描述 小明和小芳出去乡村玩,小明负责开车,小芳来导航. 小芳将可能的道路分为大道和 ...
- CCF认证 201712-4 行车路线(100分)
CCF认证 201712-4 行车路线 思路:好难啊,去学习大佬的解法了,结果吭吭哧哧的还出现很多不bug.首先用的是是spfa的算法.但是由于处理小路的时候用来floyd,所以这个时间复杂度也不小, ...
- ccf 201612-3 权限查询(100分)
问题描述 授权 (authorization) 是各类业务系统不可缺少的组成部分,系统用户通过授权机制获得系统中各个模块的操作权限. 本题中的授权机制是这样设计的:每位用户具有若干角色,每种角色具有若 ...
- CCF:201712-4 行车路线
试题编号: 201712-4 试题名称: 行车路线 时间限制: 1.0s 内存限制: 256.0MB 问题描述: 问题描述 小明和小芳出去乡村玩,小明负责开车,小芳来导航. 小芳将可能的道路分为大道和 ...
- ccf 201703-4 地铁修建(100分)
问题描述 A市有n个交通枢纽,其中1号和n号非常重要,为了加强运输能力,A市决定在1号到n号枢纽间修建一条地铁. 地铁由很多段隧道组成,每段隧道连接两个交通枢纽.经过勘探,有m段隧道作为候选,两个交通 ...
- 【CCF 201712-4】行车路线(Dijkstra 80分)
忽略一个条件:可能具有连续的小路,跑一边裸的迪杰斯特拉算法,即可拿到80分 注意:边权可能会爆int,采用long long才可以 #include <iostream> #include ...
- CCF之地铁修建(100分)
问题描述 A市有n个交通枢纽,其中1号和n号非常重要,为了加强运输能力,A市决定在1号到n号枢纽间修建一条地铁. 地铁由很多段隧道组成,每段隧道连接两个交通枢纽.经过勘探,有m段隧道作为候选,两个交通 ...
- CCF考试——201712-4行车路线
概要 问题描述 小明和小芳出去乡村玩,小明负责开车,小芳来导航. 小芳将可能的道路分为大道和小道.大道比较好走,每走1公里小明会增加1的疲劳度.小道不好走,如果连续走小道,小明的疲劳值会快速增加,连续 ...
- CCF认证考试 202012-5星际旅行 (100分)(线段树)
题目描述 传送门: 星际旅行 思路 根据题目描述,这道题显然是一道线段树的模板题.动力加和动力增强用对应线段树的区间加和区间乘操作.关键是旋转操作,回忆一下,线段树的区间加和区间乘都有对应的懒标记,而 ...
最新文章
- android builder模式 插件,如何在Kotlin中实现Builder模式?
- 老BOJ 11 Counting
- 聊聊 computed 影响性能的场景
- 解读Mybatis数据库开发框架
- QT 定时关机、共享内存、启动浏览器、浏览器前进后退刷新、进度条、设置浏览器标题、QML入门
- 通过日志审计追踪外部***
- 牛客NOIP暑期七天营-普及组1 解题报告
- minecraftjava版光追_我的世界:光追技术终于开始测试?没想到网易版已更新狐狸生物?...
- 谋学网计算机维修,19秋学期西交《计算机组成原理》在线作业1(标准答案).doc...
- 大数据产品价值主张_大数据对商业模式创新的影响
- PART 1:基于大数据人才岗位招聘情况对数据进行清洗、初步分析
- 电商设计师如何正确认知自己的价值
- windows简单命令
- SSH登录出现REMOTE HOST IDENTIFICATION HAS CHANGED故障的解决办法
- log4j和slf4j的区别
- vue 流星的样式和流光canvas
- Error Code: 1318. Incorrect number of arguments for PROCEDURE student.new_procedure; expected 0, got
- 工作室转型做什么好项目?
- 2020年全球权威机器人评选RBR50放榜:中国仅一家公司入选,大疆落榜
- Chicken for Windows Phone