洛谷 - P1346 - 电车 - Dijkstra/01BFS
https://www.luogu.org/problem/P1346
使用最短路之前居然忘记清空了。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int MAXN = 1005;
int n, s, t;
int dis[MAXN];
bool vis[MAXN];
int G[MAXN][MAXN];
const int INF = 0x3f3f3f3f;
priority_queue<pair<int, int> >pq;
void Dijkstra(int s) {
for(int i=1;i<=n;++i)
dis[i]=INF;
dis[s] = 0;
pq.push({-dis[s], s});
while(!pq.empty()) {
int u = pq.top().second;
pq.pop();
if(vis[u])
continue;
/*printf("u=%d\n",u);
for(int i = 1; i <= n; ++i) {
printf(" %d", i, dis[i]);
}
puts("");*/
vis[u] = 1;
for(int v = 1; v <= n; ++v) {
int w = G[u][v];
if(!vis[v] && dis[u] + w < dis[v]) {
dis[v] = dis[u] + w;
pq.push({-dis[v], v});
}
}
}
}
int main() {
#ifdef Yinku
freopen("Yinku.in", "r", stdin);
#endif // Yinku
scanf("%d%d%d", &n, &s, &t);
for(int i = 1; i <= n; ++i)
for(int j = 1; j <= n; ++j)
G[i][j] = INF;
for(int i = 1; i <= n; ++i)
G[i][i] = 0;
for(int u = 1; u <= n; ++u) {
int k;
scanf("%d", &k);
for(int j = 1; j <= k; ++j) {
int v;
scanf("%d", &v);
if(j == 1)
G[u][v] = 0;
else
G[u][v] = 1;
}
}
Dijkstra(s);
/*for(int i = 1; i <= n; ++i) {
printf("%d: %d\n", i, dis[i]);
}*/
printf("%d\n", dis[t] < INF ? dis[t] : -1);
return 0;
}
看了一下题解貌似还有更快的。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int MAXN = 1005;
int n, s, t;
int dis[MAXN];
bool vis[MAXN];
int G[MAXN][MAXN];
const int INF = 0x3f3f3f3f;
deque<int>q;
void BFS(int s) {
for(int i = 1; i <= n; ++i)
dis[i] = INF;
dis[s] = 0;
q.push_front(s);
while(!q.empty()) {
int u = q.front();
q.pop_front();
if(vis[u])
continue;
vis[u] = 1;
for(int v = 1; v <= n; ++v) {
if(vis[v])
continue;
int w = G[u][v];
if(w == 0) {
if(dis[u] < dis[v]) {
dis[v] = dis[u];
q.push_front(v);
}
} else if(w == 1) {
if(dis[u] + 1 < dis[v]) {
dis[v] = dis[u] + 1;
q.push_back(v);
}
}
}
}
}
int main() {
#ifdef Yinku
freopen("Yinku.in", "r", stdin);
#endif // Yinku
scanf("%d%d%d", &n, &s, &t);
for(int i = 1; i <= n; ++i)
for(int j = 1; j <= n; ++j)
G[i][j] = INF;
for(int i = 1; i <= n; ++i)
G[i][i] = 0;
for(int u = 1; u <= n; ++u) {
int k;
scanf("%d", &k);
for(int j = 1; j <= k; ++j) {
int v;
scanf("%d", &v);
G[u][v] = (j != 1);
}
}
BFS(s);
printf("%d\n", dis[t] < INF ? dis[t] : -1);
return 0;
}
那应该可以得到一个使得Dijkstra更快的办法,就是另外开一个队列,把u节点相连的距离为0的节点加入队列,每次优先从队列里面取,其次才从优先队列里面取。
这个01BFS是指有花费的边的权都一样,所以不需要优先队列,从u出发的能到的点假如有花费一定是出现在队尾的。
洛谷 - P1346 - 电车 - Dijkstra/01BFS的更多相关文章
- 洛谷——P1346 电车
P1346 电车 题目描述 在一个神奇的小镇上有着一个特别的电车网络,它由一些路口和轨道组成,每个路口都连接着若干个轨道,每个轨道都通向一个路口(不排除有的观光轨道转一圈后返回路口的可能).在每个路口 ...
- 洛谷P1346 电车
P1346 电车 236通过 757提交 题目提供者yeszy 标签图论福建省历届夏令营 难度普及/提高- 提交该题 讨论 题解 记录 最新讨论 解不好啊,快疯了!!哪位大… 求解:为何除了-1的点之 ...
- 洛谷P1346 电车【最短路】
题目:https://www.luogu.org/problemnew/show/P1346 题意:n个路口,每个路口有好几条轨道,默认指向给出的第一个路口. 如果要换到另外的轨道去需要按一次开关.问 ...
- 洛谷P1346 电车(需要稍加思索的最短路)
题目描述 在一个神奇的小镇上有着一个特别的电车网络,它由一些路口和轨道组成,每个路口都连接着若干个轨道,每个轨道都通向一个路口(不排除有的观光轨道转一圈后返回路口的可能).在每个路口,都有一个开关决定 ...
- 洛谷 P1346 电车——dijstra
上一波题目 https://www.luogu.org/problem/P1346 是道水题 路口一开始对着的那条路权值为0 其余路权值为1 然后跑一遍最短路就好了 qwq #include<c ...
- 洛谷 P1346 电车
这道题的关键在建图 把每一个车站看成一个点,将这个车站相连的第一个车站建立一条边权为0的边,对于它所相连的其他车站,建立边权为1的边: 这样我们可以得到一张图: 起点,终点都知道了,跑一边最短路即可 ...
- 洛谷 P4779 【dijkstra】+(堆优化)+(链式前向星) (模板题)
<题目链接> 题目描述 给定一个 N 个点, M 条有向边的带非负权图,请你计算从 S 出发,到每个点的距离. 数据保证你能从 S 出发到任意点. 输入格式: 第一行为三个正整数 N,M, ...
- P1346 电车(dijkstra)
P1346 电车 题目描述 在一个神奇的小镇上有着一个特别的电车网络,它由一些路口和轨道组成,每个路口都连接着若干个轨道,每个轨道都通向一个路口(不排除有的观光轨道转一圈后返回路口的可能).在每个路口 ...
- 洛谷P1462 通往奥格瑞玛的道路(二分+spfa,二分+Dijkstra)
洛谷P1462 通往奥格瑞玛的道路 二分费用. 用血量花费建图,用单源最短路判断 \(1\) 到 \(n\) 的最短路花费是否小于 \(b\) .二分时需要不断记录合法的 \(mid\) 值. 这里建 ...
随机推荐
- 记录下:nth-child在table中遇到的问题~(已解决)
首先做了一个表格,如下: <!DOCTYPE html> <html> <head> <title></title> <style t ...
- Markers
immune pdf(file = paste0(outdir,"T_B_NK_feature.pdf")) VlnPlot(expr_1_4,features = c(" ...
- HDU 6012 Lotus and Horticulture(离散化)
题目代号:HDU 6012 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6012 Lotus and Horticulture Time Limit: ...
- Android使用SDKManager下载SDK速度慢 容易丢包和异常的解决办法
第一步, SDK Manager启动之后,会先解析一些google的xml文件,会在Log里面打印出一些日志信息. 解析完之后,把日志全部拷贝到一个记事本里(这一步是因为日志窗口不支持查找),在里面查 ...
- python3.7--pycharm selenium自启360浏览器/360极速浏览器方法
写于:2019.01.02(实测日) 参考文档:https://blog.csdn.net/five3/article/details/50013159 一.下载360浏览器或360极速浏览器的Chr ...
- python中类的设计问题(一些高级问题探讨,函数重载,伪私有,工厂模式,类方法等)
从这里再次体现了python语言强大的灵活性.某些在高级语言中看似不严谨需要尽量避免的地方在python中都是允许的. 比如: (1),异常可以用来处理错误 (2),方法,类也都可以视为对象. (3) ...
- kubernetes master 更换ip(单节点)
问题分析 master ip地址变更以后,我们首先应该检查以下内容: /etc/kubernetes/manifests下面的config配置文件,替换里面对应的ip 相关的证书文件 客户端文件 解决 ...
- Python进制转换format格式化
进制转换:先介绍用传统数学方法,再介绍用python内置方法 二进制转十进制: 1101 转为十进制 1*2^(4-1)+1*2^(3-1)+0*2^(2-1)+1*2^(1-1) 即各个位拆开,乘以 ...
- ps - 按进程消耗内存多少排序
https://www.cnblogs.com/JemBai/archive/2011/06/21/2086184.html https://www.cnblogs.com/jiqing9006/p/ ...
- sed将一个文件插入到另一个文件(合并两个文件)
将before.sh的内容插入到catalina.sh的第一行之后 sed -i '1r /srv/tomcat8/bin/before.sh' /srv/tomcat8/bin/catalina.s ...