题目:

C 城有 n 个站点, m 条双向地铁,每条地铁有一个 companyicompany_icompanyi​表示它的公司,如果连续乘坐同一家公司的地铁只要花 1元钱就好。DD现在想出门找萨摩耶玩,但是 DD 是贫困人口, 她想知道最少花费多少钱能从 1 号点前往 n 号点

输入格式

第一行两个整数分别表示 n,m

接下来 m 行每行 3 个整数,分别表示地铁的起点终点和公司

输出格式

输出 DD 的最少花费是多少

数据范围

对于 30%30\%30% 的数据, n≤100,c≤100n \leq 100,c \leq 100n≤100,c≤100

对于另外 20%20\%20% 的数据, n≤105,c≤1n \leq 10^5,c \leq 1n≤105,c≤1对于 100%100\%100% 的数据, n,c≤105,m≤2×105n,c \leq 10^5,m \leq 2 \times 10^5n,c≤105,m≤2×105输出时每行末尾的多余空格,不影响答案正确性

样例输入

8 11
1 3 1
1 4 2
2 3 1
2 5 1
3 4 3
3 6 3
3 7 3
4 8 4
5 6 1
6 7 5
7 8 5

样例输出

2

分析:

本人小菜菜一枚,计蒜客面试题,这道我搞了三四个小时没搞出来,最后大佬出手,就知有木有哈,竟然是走边,orz%%%%%%%%,下面来分析哈。
1.首先看数据范围,就知道开二维数组是不得行的(除了用容器 map,vector啥的),那么这里就用邻接表,记录每一条边和点,顺便由边(tot),可以直接记录这个边上是哪家公司的车车在跑;
2.接着用优先队列建一个小根堆,里面的两个数据分别为x:与1号点连通的x号点;y:1~x点间交换过多少次公司;
3.因为建的是小根堆,每次拿出栈顶的是最小交换公司次数,所以每次存在一个与1不连通的点,进队列都更新次数,直到到达n号点。

AC代码:

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;const int N=1e5+10;
const int M=4e5+10;int n,m;
int tot,fir[N];
int nex[M],to[M],id[M];
void add(int x,int y,int z){++tot;to[tot]=y; id[tot]=z;nex[tot]=fir[x]; fir[x]=tot;
}bool vis[M];
int dis[M];
struct node{int x,y;/**node(){}node(int x,int y):x(x),y(y){}*/bool operator<(const node&a)const{return y>a.y;}
};
priority_queue<node> Q;int dij(int sr){memset(vis,0,sizeof(vis));memset(dis,0x3f,sizeof(dis));while(!Q.empty()) Q.pop();for(int i=fir[sr]; i; i=nex[i]){dis[i]=1;Q.push((node){i,1});//Q.push(node(i,1));}while(!Q.empty()){int d=Q.top().x;Q.pop();if(vis[d]) continue;vis[d]=1;int u=to[d];if(u==n) return dis[d];for(int i=fir[u]; i; i=nex[i]){int t=(id[i]==id[d])?0:1;if(!vis[i] && dis[i]>dis[d]+t){dis[i]=dis[d]+t;Q.push((node){i,dis[i]});// Q.push(node(i,dis[i]));}}}return -1;
}int main()
{scanf("%d%d",&n,&m);for(int i=0; i<m; ++i){int t1,t2,t3;scanf("%d%d%d",&t1,&t2,&t3);add(t1,t2,t3); add(t2,t1,t3);}int ans=dij(1);printf("%d\n",ans);return 0;
}

最短路(遍历边)计蒜客—DD坐地铁相关推荐

  1. DD 摆磁铁(计蒜客信息学8月普及组模拟赛)

    DD 摆磁铁 这道题来自 计蒜客信息学8月普及组模拟赛 普及组!! 把我一个TG选手看懵了 看来我要回去打普及了 题目大意 给出一个n个节点的树,要把树上给定的2*m个节点两两配对,两个节点配对的产生 ...

  2. 计蒜客 2020 蓝桥杯大学 A 组省赛模拟赛 (一)题目及解析

    新手,欢迎交流,剩下D题不知如何下手,望大佬指教. 计蒜客 2020 蓝桥杯大学 B 组省赛模拟赛 (一)题目及解析 文章目录 A. 结果填空:计算周长 B. 结果填空:七巧板 C. 结果填空:苹果 ...

  3. 坑!计蒜客——乳草的侵占

    计蒜客--乳草的侵占(BFS) BFS一直写不会,可能是多加了个队列,写起来不是太容易.不过最近还是稍微入门了BFS,跟DFS差别不太大,还是由三个部分组成--出口.标记.枚举. DFS的主要的思想就 ...

  4. 计蒜客 2020 蓝桥杯大学 B 组省赛模拟赛 (一)题目及解析

    新手,欢迎交流,更新完毕. 计蒜客 2020 蓝桥杯大学 A 组省赛模拟赛 (一)题目及解析 文章目录 A. 结果填空:有趣的数字 B. 结果填空:爬楼梯 C. 结果填空:七巧板 D. 结果填空:苹果 ...

  5. 计蒜客 T1853:非常男女(前缀和)

    上一篇博客计蒜客 T1101:大整数的因子(高精度除法详解)  写在前面:大家好!我是ACfun,我的昵称来自两个单词Accepted和fun.我是一个热爱ACM的蒟蒻.这篇博客来记录一下计蒜客T18 ...

  6. 计蒜客题解——T1214:鸣人和佐助

    题目相关 题目链接 计蒜客 OJ,https://nanti.jisuanke.com/t/T1214. 题目描述 已知一张地图(以二维矩阵的形式表示)以及佐助和鸣人的位置.地图上的每个位置都可以走到 ...

  7. 计蒜客题解——T1213:拯救行动

    题目相关 题目链接 计蒜客 OJ,https://nanti.jisuanke.com/t/T1213. 题目描述 公主被恶人抓走,被关押在牢房的某个地方.牢房用 N×M(N,M≤200) 的矩阵来表 ...

  8. 计蒜客题解——T1244:单词序列

    题目相关 题目链接 计蒜客 OJ,https://nanti.jisuanke.com/t/T1244. 我的 OJ,http://47.110.135.197/problem.php?id=4766 ...

  9. 计蒜客一月入门赛:《三个火枪手》题解

    题目链接(https://nanti.jisuanke.com/t/52314) 有 n 个人,其中有 m 对相互认识的关系. 一个人的知名度定义为 有多少人 和他相互认识. 现在蒜头君需要从这 n ...

最新文章

  1. “AI”战疫在行动,一文盘点百度大脑增援疫情防控的AI操作
  2. element-UI中手动调用table排序
  3. SDUT2608(Alice and Bob)
  4. (转)IIS tomcat共用80端口解决一个IP多个域名:使用Nginx反向代理方式使两者兼容...
  5. (原创)对某国的一次渗透
  6. Matplotlib常用命令
  7. SQLServer2008数据库还原失败 恢复失败
  8. 《机器学习算法竞赛实战》读书笔记
  9. 【无标题】快宝电子面单接口
  10. 高德地图MapABC报错
  11. 2015中国大学排行榜100强新鲜出炉(校友会版)-[转]
  12. 机械硬盘换固态硬盘重装系统
  13. python下载和pycharm下载
  14. 【python--爬虫】千图网高清背景图片爬虫
  15. python笔记2—day2
  16. 2022款联想小新Pro16,联想小新air15,thinkbook16+选哪个好
  17. php swoole 教程,PHP7安装Swoole详细教程
  18. Web前端知识CSS(响应式设计)
  19. vba 定义类_什么是模块,VBA中各种模块的有效行为
  20. JAVA爬虫(一):豆瓣电影排行榜爬取

热门文章

  1. Android之用tcpdump常用抓包命令使用总结
  2. linux之自己总结学习linux的资源推荐
  3. Android之在window下面开发常用的adb命令(不断更新)
  4. mysql的调试与分析_mysql日志管理分析调试实例_MySQL
  5. for循环延时_前端中的事件循环eventloop机制
  6. 大数据告诉你:学历真的能改变命运!!
  7. 如何有效利用碎片时间?这里有个办法
  8. 2018 年最受欢迎的 Python 库,你都用过吗?
  9. Linux里10个最危险的命令
  10. mysql普通标转分区表_MySQL分区表到普通表互转