堆優(yōu)化dijkstra
【模板】單源最短路1
http://fangfengwang8.cn/practice/f24504c9ff544f7c808f76693cc34af8
#include<iostream> #include<cstring> #include<queue> #include<vector> using namespace std; typedef struct node{ int x, w; bool operator <(const struct node o) const{ return w>o.w; } }N; int n, m, dis[5001]; vector<N> g[5001]; void dijkstra(int x){ bool vis[5001]; memset(vis, false, sizeof(vis)); memset(dis, 0x7f, sizeof(dis)); priority_queue<N> q; dis[x] = 0; q.push((N){x, 0}); while(!q.empty()){ N t = q.top(); q.pop(); for(int i=0; i<g[t.x].size(); i++){ if(dis[t.x]+1<dis[g[t.x][i].x]){ dis[g[t.x][i].x] = dis[t.x]+1; q.push((N){g[t.x][i].x, dis[g[t.x][i].x]}); } } } } int main(){ scanf("%d%d", &n, &m); for(int i=0; i<m; i++){ int u, v; scanf("%d%d", &u, &v); g[u].push_back((N){v, 1}); g[v].push_back((N){u, 1}); } dijkstra(1); if(dis[n] == 0x7f7f7f7f) cout<<-1; else cout<<dis[n]; return 0; }