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,连接ab两个路口,长度为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, bnt是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分)相关推荐

  1. CCF 行车路线 100分

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

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

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

  3. CCF-CSP认证历年真题解(100分)

    转载: 链接出自:https://blog.csdn.net/tigerisland45/article/details/54755895 CCF-CSP认证历年真题解–python语言 CCF-CS ...

  4. ccf 201412-4 最优灌溉 (100分)

    问题描述 雷雷承包了很多片麦田,为了灌溉这些麦田,雷雷在第一个麦田挖了一口很深的水井,所有的麦田都从这口井来引水灌溉. 为了灌溉,雷雷需要建立一些水渠,以连接水井和麦田,雷雷也可以利用部分麦田作为&q ...

  5. CCF认证 2017-12 行车路线

    最短路的变形,有两种道路,需要分开计算最短距离,要不然得不到全局最优解 考试得分80,后来看了好久发现,竟然是int爆掉了,导致没有满分(囧) #include<iostream> #in ...

  6. CCF 201812-1 小明上学 100分

    CCF 201812-1 小明上学 题目背景 小明是汉东省政法大学附属中学的一名学生,他每天都要骑自行车往返于家和学校.为了能尽可能充足地睡眠,他希望能够预计自己上学所需要的时间.他上学需要经过数段道 ...

  7. CCF CSP 公共钥匙盒 JAVA 201709-2 100分

    这道题做了几遍 感觉这次做得比较好的就是做好了每个函数的封装 无非使用了二维数组的排序  就变成了很简单的一道题 package csp2017_09_2;import java.util.Array ...

  8. CCF 201709-2 公共钥匙盒 (Java 100分)

    文章目录 1 题目 2 我的思路 3 代码 1 题目 问题描述 有一个学校的老师共用N个教室,按照规定,所有的钥匙都必须放在公共钥匙盒里,老师不能带钥匙回家.每次老师上课前,都从公共钥匙盒里找到自己上 ...

  9. CCF CSP 炉石传说 JAVA 201609-3 100分

    这个题麻烦在角色的信息不好处理 想想其实也好处理,只需要封装一个角色类,将生命值和攻击力封装起来就好了 还有一点是随从进场位置,如果出现在左边要使右面所有随从position+1 其实也好处理,正好! ...

  10. CCF认证历年真题 满分代码(更新至2018年12月)

    目标是集齐所有CCF认证试题的满分代码! 每次考试出题一般规律: 第一题:水题(稍微有些编程经验就可以写) 第二题:小模拟(处理比较简单的问题,掌握C++STL很有帮助) 第三题:大模拟(处理复杂的问 ...

最新文章

  1. fond+html属性,JQuery 干货篇之选择元素
  2. UA SIE545 优化理论基础 例题 对偶函数的凸性与次梯度计算
  3. 摄像头夜间拍摄画面有拖影_iQOO 3延续vivo人像拍摄基因 这些技术必须了解
  4. tooltip trigger怎么改气泡的背景颜色_精装房这样改更完美,不砸墙不改电,低预算就能做到!...
  5. java转文件编码bom_编码转换:UTF-8 BOM to GBK
  6. 在保存Bitmap的时候出现“GDI出现一般性错误”
  7. (())、let、expr、bc等计算命令的使用语法和应用技巧
  8. 小数点后最多几位_一个“90后”女生的月账单,花得最多的果然是这个
  9. 小游戏开发--Cocos引擎
  10. 进入阿里做测试员遥不可及?这里或许有你想要的答案
  11. 关于Cognos Netscape directory server的安装
  12. WBE前端笔记3:JavaScript练习--基础语法
  13. matlab画填充直方图,matlab使用imhist、plot、fill画可填充颜色连续直方图
  14. gg修改器修改数值没有用怎么办_gg修改器修改游戏数值教程_gg修改器怎么修改数值_3DM手游...
  15. JDBC 实现数据库增删改查
  16. matlab示波器有毛刺,在使用示波器时如何消除毛刺?
  17. c语言解一元一次方程(及一元高次方程)
  18. (Tiled官方文档翻译)第四节:对象的编辑和使用
  19. 链表详解(单链表、双向链表、链表逆序)
  20. LDAP(1) 认知入门

热门文章

  1. 即时通讯环信IM的集成使用
  2. C语言基础:函数的声明与定义
  3. MySQL的外网访问配置
  4. ES6简介、新特性、Babel编译器、babel-cli工具、babel-polyfill工具(安装和使用)
  5. 在线支付——如何防止订单重复支付?
  6. 浏览器是如何验证HTTPS证书合法性的?
  7. MATLAB 面向对象编程(十二)抽象类
  8. 便签提醒事项怎么设置闹钟
  9. xgboost的调优
  10. IDEA phpstorm插件CamelCase 【大小写,下划线,驼峰,首字母大写等转化工具】