POJ - 1847 Tram(dijkstra)
生活随笔
收集整理的這篇文章主要介紹了
POJ - 1847 Tram(dijkstra)
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
題意:有向圖有N個(gè)點(diǎn),當(dāng)電車進(jìn)入交叉口(某點(diǎn))時(shí),它只能在開關(guān)指向的方向離開。 如果駕駛員想要采取其他方式,他/她必須手動(dòng)更換開關(guān)。當(dāng)駕駛員從路口A駛向路口B時(shí),他/她嘗試選擇將他/她不得不手動(dòng)更換開關(guān)的次數(shù)最小化的路線。
編寫一個(gè)程序,該程序?qū)⒂?jì)算從交點(diǎn)A到交點(diǎn)B所需的最小開關(guān)更改次數(shù)。第i個(gè)交點(diǎn)處的開關(guān)最初指向列出的第一個(gè)交點(diǎn)的方向。
分析:對(duì)于某點(diǎn)i,去往其直接可到達(dá)的點(diǎn)列表中的第一個(gè)點(diǎn)時(shí)不需要更換開關(guān),等價(jià)于邊長為0;而其他的點(diǎn)需要更換開關(guān),等價(jià)于邊長為1。dijkstra裸題。
#include<cstdio> #include<map> #include<iostream> #include<cstring> #include<queue> using namespace std; const int MAXN = 100 + 10; const int INF = 0x3f3f3f3f; struct Edge{int from, to, dist;Edge(int f, int t, int d):from(f), to(t), dist(d){} }; struct HeapNode{int d, u;HeapNode(int dd, int uu):d(dd), u(uu){}bool operator < (const HeapNode&rhs)const{return d > rhs.d;} }; struct Dijkstra{int n, m;vector<int> G[MAXN];vector<Edge> edges;bool done[MAXN];int d[MAXN];int p[MAXN];void init(int n){this -> n = n;for(int i = 1; i <= n; ++i) G[i].clear();edges.clear();}void AddEdge(int from, int to, int dist){edges.push_back(Edge(from, to, dist));m = edges.size();G[from].push_back(m - 1);}void dijkstra(int s){priority_queue<HeapNode> q;for(int i = 1; i <= n; ++i) d[i] = INF;memset(done, false, sizeof done);d[s] = 0;q.push(HeapNode(0, s));while(!q.empty()){HeapNode top = q.top();q.pop();if(done[top.u]) continue;done[top.u] = true;int len = G[top.u].size();for(int i = 0; i < len; ++i){Edge e = edges[G[top.u][i]];if(d[top.u] + e.dist < d[e.to]){d[e.to] = d[top.u] + e.dist;p[e.to] = G[top.u][i];q.push(HeapNode(d[e.to], e.to));}}}} }dij; int main(){int N, A, B;scanf("%d%d%d", &N, &A, &B);dij.init(N);for(int i = 1; i <= N; ++i){int k, x;scanf("%d", &k);for(int j = 0; j < k; ++j){scanf("%d", &x);if(j == 0) dij.AddEdge(i, x, 0);else dij.AddEdge(i, x, 1);}}dij.dijkstra(A);if(dij.d[B] == INF) printf("-1\n");else printf("%d\n", dij.d[B]);return 0; }
轉(zhuǎn)載于:https://www.cnblogs.com/tyty-Somnuspoppy/p/9084352.html
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)總結(jié)
以上是生活随笔為你收集整理的POJ - 1847 Tram(dijkstra)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 苹果 iPhone 12什么时候发布北京
- 下一篇: qq空间如何设置只能看三天(登录QQ邮箱