博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
洛谷 - P1346 - 电车 - Dijkstra/01BFS
阅读量:4681 次
发布时间:2019-06-09

本文共 3091 字,大约阅读时间需要 10 分钟。

使用最短路之前居然忘记清空了。

#include
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
>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
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
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出发的能到的点假如有花费一定是出现在队尾的。

转载于:https://www.cnblogs.com/Yinku/p/11345393.html

你可能感兴趣的文章
一种人吃蜂蜜火上浇油
查看>>
让TP5.0在SWOOLE上飞起来
查看>>
Mysql - ORDER BY详解
查看>>
百度云高速下载Pandownload
查看>>
python 基础 three day
查看>>
Redis
查看>>
Bat 批处理之 for/f 详解
查看>>
Python之os模块介绍
查看>>
SQLServer查询所有子节点
查看>>
Javascript 兼容 IE6、IE7、FF 的“加入收藏”“设为首页”
查看>>
(转)EOS中账户、钱包和密钥的关系
查看>>
在C#中,如何将一个int转换成一个byte array,又如何将一个byte array转换成一个int...
查看>>
DOM和BOM
查看>>
web前端_跨域问题方法总结
查看>>
英文词频统计预备,组合数据类型练习
查看>>
C# Windows - ListBox&CheckedListBox
查看>>
AES对上传文件解密并加密的实现(JAVA实现)
查看>>
ThreadLocal 正名
查看>>
AngularJS自定义指令详解(有分页插件代码)
查看>>
数据挖掘学习--数据仓库
查看>>