算法提高课-图论-单源最短路的建图方式-AcWing 920. 最优乘车:bfs求最短路、建图
生活随笔
收集整理的這篇文章主要介紹了
算法提高课-图论-单源最短路的建图方式-AcWing 920. 最优乘车:bfs求最短路、建图
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
題目分析
來源:acwing
分析:
本題難在抽象建圖上,這里采用的建圖方式是:同一條公交線路上,前面的站點都可以連一條有向邊到其后面的站點,且邊權都為1.
由于邊權都是1,可以用bfs來求最短路。
注意,這樣求出來的是坐了幾輛公交車,如果算換成次數的話,需要-1.
另外,由于每行的公交站點數未給出,這里一行一行地讀,使用getline(cin, line);然后 通過庫stringstream來進行切割,stringstream ssin(line); 確定每行共有多少個以空格分隔的數據:while(ssin >> 變量) cnt ++;
此題建圖參考,這道PAT的題目更難一些:PAT甲級1131 Subway Map (30分):[C++題解]堆優化dijkstra、單源最短路、地鐵地圖、巧妙地建圖套dijkstra模板!!
ac代碼
#include<bits/stdc++.h> using namespace std; const int N = 510;int dist[N]; bool st[N]; int q[N];bool g[N][N]; int stop[N]; // 暫存某條公交線路的站點 int n, m;void bfs(){int hh = 0, tt = 0;memset(dist, 0x3f, sizeof dist);dist[1] = 0;q[0] = 1;while( hh <= tt){int t= q[hh++];for(int i = 1; i<= n; i ++){if(g[t][i] && dist[i] > dist[t] + 1){dist[i] = dist[t] + 1;q[ ++ tt] = i;}}} } int main(){cin >> m >> n;getchar();string line;for(int i = 1; i<= m; i++){getline(cin, line);stringstream ssin(line);int cnt = 0; // 公交線路站牌數量int p;while(ssin >> p) stop[cnt++] = p;for(int j = 0; j< cnt ;j ++)for(int k = j + 1; k < cnt; k ++)g[stop[j]][stop[k]] = true;}bfs();if(dist[n] == 0x3f3f3f3f) cout << "NO" << endl;else cout << dist[n] -1 << endl; }題目來源
https://www.acwing.com/problem/content/922/
總結
以上是生活随笔為你收集整理的算法提高课-图论-单源最短路的建图方式-AcWing 920. 最优乘车:bfs求最短路、建图的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 算法提高课-图论-单源最短路的建图方式-
- 下一篇: 算法提高课-图论-单源最短路的建图方式-