题解 | #单源最短路#
单源最短路
http://www.nowcoder.com/practice/9f15b34a2a944a7798a5340ff0dba8b7
class Solution { public: const int inf = 0x3f3f3f3f; struct Node{ int v; int dis; Node(int _v, int _dis):v(_v), dis(_dis){} bool operator < (const Node& other) const{ return dis > other.dis; } }; int graphs[505][505]; vector<bool> vis; vector<int> dist; int findShortestPath(int n, int m, vector<vector<int> >& graph) { // write code here memset(graphs, inf, sizeof(graphs)); dist.resize(n + 1, inf); vis.resize(n + 1, false); for(int i = 0; i < m; i ++){ int u = graph[i][0], v = graph[i][1], dis = graph[i][2]; graphs[u][v] = min(graphs[u][v], dis); //有向边 } priority_queue<Node> pq; pq.push({1, 0}); dist[1] = 0; int cnt = 0; while(!pq.empty()){ Node node = pq.top(); pq.pop(); int u = node.v, dis = node.dis; if(!vis[u]){ vis[u] = true; cnt ++; if(cnt == n) break; }else continue; for(int v = 1; v <= n; v ++){ if(v == u || graphs[u][v] == inf) continue; if(dist[u] + graphs[u][v] < dist[v]){ dist[v] = dist[u] + graphs[u][v]; pq.push({v, dist[v]}); } } } return dist[n] >= inf ? -1 : dist[n]; } };