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. mysql存储ip数值

    字段使用 int unsigned 类型就可以满足存贮ip2long(ip)的数值 插入时,可以使用inet_aton('100.200.30.22') 将ip地址转换为数值 查询时,使用inet_n ...

  2. 多线程--future模式初体验

    第一次使用多线程,虽然理解的不是很透彻,但是也值得记录下.用的是future模式. 创建个线程池:private ExecutorService cachedThreadPool = Executor ...

  3. 【bzoj3672&&uoj7】[Noi2014]购票

    *题目描述: 今年夏天,NOI在SZ市迎来了她30周岁的生日.来自全国 n 个城市的OIer们都会从各地出发,到SZ市参加这次盛会. 全国的城市构成了一棵以SZ市为根的有根树,每个城市与它的父亲用道路 ...

  4. 苹果CMSv10宝塔全自动定时采集教程

    伙伴们在建立好自己的网站添加自定义资源库后,由于手动采集方式比较耗时间和精力更新也不够及时,是不是特别希望能有一个全自动定时采集方法来帮助网站增加视频资源解放自己的双手,那么现在就教大家如何用宝塔一步 ...

  5. Mac 安装 MongoDB 数据库

    1. 使用 brew install mongodb 安装 (参见下图) 2. 安装成功如下图 (成功与否可参考 方框内字符) 3. 启动 MongoDB 数据库 3.1 先创建数据库存储目录 /da ...

  6. Oracle-分配用户只读存储过程权限

    系统新来了系统运维人员,要求创建数据库账号,只分配对表,视图,存储程序有只读权限 因为表和视图权限接触比较频繁,所以今天花点时间整理下关于存储过程的权限 关于ORACLE账号的权限问题,一般分为两种权 ...

  7. ScvQ的技术栈

    前端:spring mybatis hibernate struts2 SpringMVC echache quartz 后台:servlet jsp jdbc io html css javascr ...

  8. 【转】UNITY中相机空间,投影空间的正向问题

    原文链接1:https://www.cnblogs.com/wantnon/p/4570188.html 原文链接2:https://www.cnblogs.com/hefee/p/3820610.h ...

  9. [torch] pytorch hook学习

    pytorch hook学习 register_hook import torch x = torch.Tensor([0,1,2,3]).requires_grad_() y = torch.Ten ...

  10. VASP学习笔记--输入输出文件

    一.VASP 全称Vienna Ab-initio Simulation Package,是维也纳大学Hafner小组开发的进行电子结构计算和量子力学-分子动力学模拟软件包. 它是目前材料模拟和计算物 ...