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. #417 Div2 Problem B Sagheer, the Hausmeister (DFS && 枚举)

    题目链接:http://codeforces.com/contest/812/problem/B 题意 : 给出一个 n (1 ≤ n ≤ 15)层的教学楼, 每一层楼包含 m (1 ≤ m ≤ 10 ...

  2. VGA/DVI/HDMI/DP/Type-C等常用显示接口对比介绍

    在我们的生活中,无论是电脑.电视还是投影设备等等,都离不开视频输出接口,尤其在显卡上面,通常会出现3种甚至更多的接口.很多人并不了解其中的区别,觉得只要有画面输出就可以了,其实对于很多显示器来说并非如 ...

  3. nginx下的负载均衡

    负载均衡应用场景: 普通web应用部署到多台应用服务器上,客户端通过访问应用服务器发送请求,最简单的就是n对1模式,n个客户端访问同一个应用服务器,这种情况当并发量大了,就无法应对,而且,如果只有一台 ...

  4. linux grep 正则

    grep : 显示匹配行 -v: 反显示 -e 使用扩展正则表达式 黑色字体表明是原生正则表达式 红色字体表明是扩张正则表达式 1.匹配操作符 \: 转义字符串(正则使用扩展字符操作  没有使用-e ...

  5. UNITY ET 框架

    GITHUB上近3000星的开源框架,包括了服务器客户端,IL RUNTIME热等特点,对于新项目,值得拥有

  6. 使用mybatis-generator-core-1.3.2.jar根据数据库表自动生成实体

    1 导入mybatis-generator-core-1.3.2.jar 2配置mbg.xml <?xml version="1.0" encoding="UTF- ...

  7. 阶段3 1.Mybatis_03.自定义Mybatis框架_6.自定义Mybatis的编码-实现基于XML的查询所有操作

    接下来就可以写创建代理对象的方法了 类加载器,代理谁,就用谁的加载器,因为这里用daoInterfaceClass.getClassLoader() 第二个代理谁就要和谁有相同的接口,daoInter ...

  8. Python中的Django框架中prefetch_related()函数对数据库查询的优化

    实例的背景说明 假定一个个人信息系统,需要记录系统中各个人的故乡.居住地.以及到过的城市.数据库设计如下: Models.py 内容如下: ? 1 2 3 4 5 6 7 8 9 10 11 12 1 ...

  9. IDEA无法导入HttpServlet包解决方法

    1.maven项目 直接在pom.xml中添加对java servlet api的依赖即可,比较常用的一个servlet版本3.1.0的依赖如下: <!-- https://mvnreposit ...

  10. Java课堂疑问解答与思考5

    一:运行 TestInherits.java 示例,观察输出,总结. TestInherits.java class Grandparent { public Grandparent() { Syst ...