首页 > 代码库 > 优先队列来处理的 最短路径

优先队列来处理的 最短路径

看了好久终于看懂了 ,首先你要知道 优先队列在这里的作用是什么。在Djsktra的算法中 我们需要有三个for其中有个for是要找到 连接中最小的点 并且返回该点 ,这里的优先队列把这个for循环替掉。typedef pair pii;priority_queue< pii , vector , greater > q; 这个优先队列是根据 pair 中的first来 从小到大排的。这里的pair中的first的值就是dist 所以q.top时 返回了这个最小的点V #include#include#include#includeusing namespace std;#define MAX 100const 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;}