看了好久终于看懂了 ,首先你要知道 优先队列在这里的作用是什么。在Djsktra的算法中 我们需要有三个for 其中有个for是要找到 连接中最小的点 并且返回该点 ,这里的优先队列把这个for循环替掉。 typedef pair pii; priority_queue< pii , vector , greater > q; 这个优先队列是根据 pair 中的first来 从小到大排的。 这里的pair中的first的值就是dist 所以q.top时 返回了这个最小的点V #include #include #include #include using namespace std; #define MAX 100 const int INF = (1<<30) - 1; typedef pair pii; priority_queue< pii , vector , greater > q; //优先队列 int edges[MAX][MAX]; //邻接表 int n , m; int d[MAX]; //路径长度 void init() { for(int i = 0; i < n; ++i) { for(int j = 0; j < n; ++j) { if(i == j) edges[i][j] = 0; else edges[i][j] = INF; } } } void dijkstra(int v) { bool done[MAX]; for(int i = 0; i < n; ++i) { d[i] = (edges[v][i] == 0 ? 0 : INF); } memset(done,0,sizeof(done)); q.push(make_pair(d[v],v)); \\ v:起点 while(!q.empty()) { pii u = q.top(); q.pop(); int x = u.second; if(done[x]) continue; done[x] = true; for(int j = 0; j < n; ++j) { if(!done[j] && edges[x][j] < INF && d[x] + edges[x][j] < d[j]) { d[j] = d[x] + edges[x][j]; q.push( make_pair(d[j],j) ); } } } for(int i = 0; i < n; ++i) { cout << d[i] << endl; } } int main() { int vi = 0; int u , v , w; cin >> n >> m; init(); for(int i = 0; i < m; ++i) //无向图的输入 { cin >> u >> v >> w; edges[u][v] = edges[v][u] = w; } dijkstra(vi); return 0; }
优先队列来处理的 最短路径
时间: 2024-10-05 16:27:25