洛谷P1346 电车【最短路】
2024-08-27 05:57:49
题目:https://www.luogu.org/problemnew/show/P1346
题意:n个路口,每个路口有好几条轨道,默认指向给出的第一个路口。
如果要换到另外的轨道去需要按一次开关。问从a到b最少需要几次开关。
思路:可以把默认的路口的轨道权值设为0,其他的权值都是1,不通的权值都是inf。
然后跑一遍最短路。注意-1.
#include<cstdio>
#include<cstdlib>
#include<map>
#include<set>
#include<cstring>
#include<algorithm>
#include<vector>
#include<cmath>
#include<stack>
#include<queue>
#include<iostream> #define inf 0x3f3f3f3f
using namespace std;
typedef long long LL;
typedef pair<int, int> pr; int n, a, b;
const int maxn = ;
int g[maxn][maxn];
bool vis[maxn];
int d[maxn];
void dijkstra(int st)
{
memset(d, 0x3f, sizeof(d));
d[st] = ;
vis[st] = true;
for(int i = ; i <= n; i++){
if(i != st)d[i] = g[st][i];
}
for(int t = ; t < n; t++){
int min = inf, minid;
for(int i = ; i <= n; i++){
if(!vis[i] && d[i] < min){
min = d[i];
minid = i;
}
} vis[minid] = true;
for(int i = ; i <= n; i++){
if(d[i] > min + g[minid][i]){
d[i] = min + g[minid][i];
}
}
} return;
} int main()
{
scanf("%d%d%d", &n, &a, &b);
memset(g, 0x3f, sizeof(g));
for(int i = ; i <= n; i++){
int k, to;
scanf("%d", &k);
if(k){
scanf("%d", &to);
g[i][to] = ;
}
for(int j = ; j < k; j++){
scanf("%d", &to);
g[i][to] = ;
}
} dijkstra(a);
if(d[b] > 1e9)printf("-1\n");
else printf("%d\n", d[b]);
return ;
}
最新文章
- [Unity3D][Vuforia][IOS]vuforia在unity3d中添加自己的动态模型,识别自己的图片,添加GUI,播放视频
- Mac 将mysql路径加入环境变量
- 人脸对齐ASM-AAM-CLM的一些总结
- C++ 头文件系列(iterator)
- [技术] OIer的C++标准库 : 字符串库<;string>;
- 创建一个QT for Android的传感器应用应用程序(摘自笔者2015年将出的《QT5权威指南》,本文为试读篇)
- k短路(A*)
- 实现多线程爬取数据并保存到mongodb
- PXC添加新节点
- SpringIOC和AOP原理 设计模式
- box-sizing 和 dom width
- Spring Boot 1.5.10 发布:修复重要安全漏洞!!!
- zabbix2.2 - FromDual.MySQL.check"; became not supported
- 3 Python 函数介绍
- Percona XtraDB Cluster 5.7
- MVC 源码调试
- 使用SoapUI生成WS请求报文
- js数组基本知识
- 前端读者 | Web App开发入门
- C# 获取电脑硬盘剩余空间