CCF认证 201712-4 行车路线(100分)
CCF认证 201712-4 行车路线
思路:好难啊,去学习大佬的解法了,结果吭吭哧哧的还出现很多不bug。首先用的是是spfa的算法。但是由于处理小路的时候用来floyd,所以这个时间复杂度也不小,当我把floy的j=i+1改成1开始就超时了。g0[i][j]保存着小路i-j的总长 然后分大路小路两种情况更新最短路。(参考博客)
问题描述
小明和小芳出去乡村玩,小明负责开车,小芳来导航。
小芳将可能的道路分为大道和小道。大道比较好走,每走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。
#include<cstdio>
#include<iostream>
#include<queue>
#include<cstring>
#include<cmath>
using namespace std;
const int maxn=500+10;
typedef long long ll;
const ll inf=1e18;
bool vis[maxn];
int que[maxn];
ll dis[maxn],dis0[maxn];
ll g[maxn][maxn],g0[maxn][maxn];
//81
void spfa(int start,int n){int front=0,rear=0;//手动队列 for(int i=1;i<=n;i++){if(i==start){que[rear++]=i;vis[i]=true;dis[i]=dis0[i]=0;}else{vis[i]=false;dis[i]=dis0[i]=inf;}}while(front!=rear){int u=que[front++];//cout<<u<<endl;vis[u]=false;//cout<<u<<" "<<dis[u]<<endl;if(front>=maxn) front=0;//front%=maxn;//超过限度 front=front%maxnfor(int i=1;i<=n;i++){ll v=g[u][i];//大陆的花费 if(dis[i]>dis[u]+v) {dis[i]=dis[u]+v;if(!vis[i]){vis[i]=true;que[rear++]=i;if(rear>=maxn) rear=0;//rear%=maxn;//rear%=maxn} }if(dis[i]>dis0[u]+v){dis[i]=dis0[u]+v;if(!vis[i]){vis[i]=true;que[rear++]=i;if(rear>=maxn) rear=0;//rear%=maxn; }}if(g0[u][i]!=inf)//可由小路到达 {v=g0[u][i]*g0[u][i];if(dis0[i]>dis[u]+v)//走小路,前驱为小路时不能走小路{dis0[i]=dis[u]+v;if(!vis[i]){vis[i]=true;que[rear++]=i;if(rear>=maxn) rear=0;} }} } }
}
//zuiduan
int main()
{ll a,b,c,d;int n,m;scanf("%d%d",&n,&m);for(int i=0;i<=n;i++)for(int j=0;j<=n;j++) g[i][j]=g0[i][j]=inf;for(int i=0;i<m;i++){scanf("%lld%lld%lld%lld",&a,&b,&c,&d);if(a&&g0[b][c]>d) g0[b][c]=g0[c][b]=d;//小路 if(!a&&g[b][c]>d) g[b][c]=g[c][b]=d;//大路 //cout<<g[b][c]<<" "<<g0[b][c]<<endl;}for(int k=1;k<=n;k++){for(int i=1;i<=n;i++)for(int j=i+1;j<=n;j++){if(k==i||j==k) continue;if(g0[i][j]>g0[i][k]+g0[k][j]) g0[i][j]=g0[i][k]+g0[k][j];}}spfa(1,n);printf("%lld\n",min(dis[n],dis0[n]));return 0;
}
CCF认证 201712-4 行车路线(100分)相关推荐
- CCF 行车路线 100分
试题编号: 201712-4 试题名称: 行车路线 时间限制: 1.0s 内存限制: 256.0MB 问题描述: 问题描述 小明和小芳出去乡村玩,小明负责开车,小芳来导航. 小芳将可能的道路分为大道和 ...
- ccf认证 201712-4行车路线(100分)
题目: 问题描述 小明和小芳出去乡村玩,小明负责开车,小芳来导航. 小芳将可能的道路分为大道和小道.大道比较好走,每走1公里小明会增加1的疲劳度.小道不好走,如果连续走小道,小明的疲劳值会快速增加,连 ...
- CCF-CSP认证历年真题解(100分)
转载: 链接出自:https://blog.csdn.net/tigerisland45/article/details/54755895 CCF-CSP认证历年真题解–python语言 CCF-CS ...
- ccf 201412-4 最优灌溉 (100分)
问题描述 雷雷承包了很多片麦田,为了灌溉这些麦田,雷雷在第一个麦田挖了一口很深的水井,所有的麦田都从这口井来引水灌溉. 为了灌溉,雷雷需要建立一些水渠,以连接水井和麦田,雷雷也可以利用部分麦田作为&q ...
- CCF认证 2017-12 行车路线
最短路的变形,有两种道路,需要分开计算最短距离,要不然得不到全局最优解 考试得分80,后来看了好久发现,竟然是int爆掉了,导致没有满分(囧) #include<iostream> #in ...
- CCF 201812-1 小明上学 100分
CCF 201812-1 小明上学 题目背景 小明是汉东省政法大学附属中学的一名学生,他每天都要骑自行车往返于家和学校.为了能尽可能充足地睡眠,他希望能够预计自己上学所需要的时间.他上学需要经过数段道 ...
- CCF CSP 公共钥匙盒 JAVA 201709-2 100分
这道题做了几遍 感觉这次做得比较好的就是做好了每个函数的封装 无非使用了二维数组的排序 就变成了很简单的一道题 package csp2017_09_2;import java.util.Array ...
- CCF 201709-2 公共钥匙盒 (Java 100分)
文章目录 1 题目 2 我的思路 3 代码 1 题目 问题描述 有一个学校的老师共用N个教室,按照规定,所有的钥匙都必须放在公共钥匙盒里,老师不能带钥匙回家.每次老师上课前,都从公共钥匙盒里找到自己上 ...
- CCF CSP 炉石传说 JAVA 201609-3 100分
这个题麻烦在角色的信息不好处理 想想其实也好处理,只需要封装一个角色类,将生命值和攻击力封装起来就好了 还有一点是随从进场位置,如果出现在左边要使右面所有随从position+1 其实也好处理,正好! ...
- CCF认证历年真题 满分代码(更新至2018年12月)
目标是集齐所有CCF认证试题的满分代码! 每次考试出题一般规律: 第一题:水题(稍微有些编程经验就可以写) 第二题:小模拟(处理比较简单的问题,掌握C++STL很有帮助) 第三题:大模拟(处理复杂的问 ...
最新文章
- fond+html属性,JQuery 干货篇之选择元素
- UA SIE545 优化理论基础 例题 对偶函数的凸性与次梯度计算
- 摄像头夜间拍摄画面有拖影_iQOO 3延续vivo人像拍摄基因 这些技术必须了解
- tooltip trigger怎么改气泡的背景颜色_精装房这样改更完美,不砸墙不改电,低预算就能做到!...
- java转文件编码bom_编码转换:UTF-8 BOM to GBK
- 在保存Bitmap的时候出现“GDI出现一般性错误”
- (())、let、expr、bc等计算命令的使用语法和应用技巧
- 小数点后最多几位_一个“90后”女生的月账单,花得最多的果然是这个
- 小游戏开发--Cocos引擎
- 进入阿里做测试员遥不可及?这里或许有你想要的答案
- 关于Cognos Netscape directory server的安装
- WBE前端笔记3:JavaScript练习--基础语法
- matlab画填充直方图,matlab使用imhist、plot、fill画可填充颜色连续直方图
- gg修改器修改数值没有用怎么办_gg修改器修改游戏数值教程_gg修改器怎么修改数值_3DM手游...
- JDBC 实现数据库增删改查
- matlab示波器有毛刺,在使用示波器时如何消除毛刺?
- c语言解一元一次方程(及一元高次方程)
- (Tiled官方文档翻译)第四节:对象的编辑和使用
- 链表详解(单链表、双向链表、链表逆序)
- LDAP(1) 认知入门