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的更多相关文章

  1. 洛谷——P1346 电车

    P1346 电车 题目描述 在一个神奇的小镇上有着一个特别的电车网络,它由一些路口和轨道组成,每个路口都连接着若干个轨道,每个轨道都通向一个路口(不排除有的观光轨道转一圈后返回路口的可能).在每个路口 ...

  2. 洛谷P1346 电车

    P1346 电车 236通过 757提交 题目提供者yeszy 标签图论福建省历届夏令营 难度普及/提高- 提交该题 讨论 题解 记录 最新讨论 解不好啊,快疯了!!哪位大… 求解:为何除了-1的点之 ...

  3. 洛谷P1346 电车【最短路】

    题目:https://www.luogu.org/problemnew/show/P1346 题意:n个路口,每个路口有好几条轨道,默认指向给出的第一个路口. 如果要换到另外的轨道去需要按一次开关.问 ...

  4. 洛谷P1346 电车(需要稍加思索的最短路)

    题目描述 在一个神奇的小镇上有着一个特别的电车网络,它由一些路口和轨道组成,每个路口都连接着若干个轨道,每个轨道都通向一个路口(不排除有的观光轨道转一圈后返回路口的可能).在每个路口,都有一个开关决定 ...

  5. 洛谷 P1346 电车——dijstra

    上一波题目 https://www.luogu.org/problem/P1346 是道水题 路口一开始对着的那条路权值为0 其余路权值为1 然后跑一遍最短路就好了 qwq #include<c ...

  6. 洛谷 P1346 电车

    这道题的关键在建图 把每一个车站看成一个点,将这个车站相连的第一个车站建立一条边权为0的边,对于它所相连的其他车站,建立边权为1的边: 这样我们可以得到一张图: 起点,终点都知道了,跑一边最短路即可 ...

  7. 洛谷 P4779 【dijkstra】+(堆优化)+(链式前向星) (模板题)

    <题目链接> 题目描述 给定一个 N 个点, M 条有向边的带非负权图,请你计算从 S 出发,到每个点的距离. 数据保证你能从 S 出发到任意点. 输入格式: 第一行为三个正整数 N,M, ...

  8. P1346 电车(dijkstra)

    P1346 电车 题目描述 在一个神奇的小镇上有着一个特别的电车网络,它由一些路口和轨道组成,每个路口都连接着若干个轨道,每个轨道都通向一个路口(不排除有的观光轨道转一圈后返回路口的可能).在每个路口 ...

  9. 洛谷P1462 通往奥格瑞玛的道路(二分+spfa,二分+Dijkstra)

    洛谷P1462 通往奥格瑞玛的道路 二分费用. 用血量花费建图,用单源最短路判断 \(1\) 到 \(n\) 的最短路花费是否小于 \(b\) .二分时需要不断记录合法的 \(mid\) 值. 这里建 ...

随机推荐

  1. select 语句关键字优先级

    1.select 语句优先级 select classid, userid, name, age from study where userid > 15 group by classid ha ...

  2. PHP大文件分片上传断点续传实例源码

    1.使用PHP的创始人 Rasmus Lerdorf 写的APC扩展模块来实现(http://pecl.php.net/package/apc) APC实现方法: 安装APC,参照官方文档安装,可以使 ...

  3. IoC容器简介

    官网说明: 在核心的第7章节 1 Spring IoC 容器和 beans 简介 本章介绍了 Spring Framework implementation of the Inversion of C ...

  4. css使用1

    一.引入css的三种方式 一.CSS(Cascading Style Sheet):层叠样式表 二.CSS样式由两个组成部分:选择器和声明.声明又包括属性和属性值.每个声明之后用分号结束 语法结构 选 ...

  5. go语言系列--golang在windows上的安装和开发环境goland的配置

    在windows上安装golang软件 golang中国网址为:https://studygolang.com/dl 我的学习选择版本:1.12.5 golang 1.12.5版本更新的内容:gola ...

  6. easyhook源码分析一

    easyhook简要说明: easyhook是一个开源的hook库(http://easyhook.github.io/),其支持托管代码(.NET)和非托管代码(C/C++)hook,这里只分析了其 ...

  7. eclipse下 hibernate逆向数据库操作示例!!

    做项目必然要先进行数据库表设计,然后根据数据库设计建立实体类(VO),这是理所当然的,但是到公司里做项目后,让我认识到,没有说既进行完数据库设计后还要再“自己”建立一变VO.意思是,在项目设计时,要么 ...

  8. 性能测试工具之WebBench

    一.简介 WebBench是一款在Linux下使用非常简单的压力测试工具.它的原理是:WebBench首先fork出多个子进程,每个子进程都循环做web访问测试.子进程把访问的结果通过pipe告诉父进 ...

  9. Windows下对函数打桩,及Linux类似技术

    一个简单的桩实现类: #define JMPCODE_LENGTH 5 //x86 平坦内存模式下,绝对跳转指令长度 #define JMPCMD_LENGTH 1 //机械码0xe9长度 #defi ...

  10. laravel 中 同个主域名下,多个项目共享session登录状态

    共享session的前提是session在一个公共的地方,比如database,redis等,laravel框架提供了很大驱动选择: 这里只需要在配置文件里配置三个地方即可 'driver' => ...