迪杰斯特拉_优先队列 模板

Posted zuiaimiusi

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了迪杰斯特拉_优先队列 模板相关的知识,希望对你有一定的参考价值。

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 struct node
 4 {
 5     int pos,len;
 6     bool friend operator<(node c,node d)
 7     {
 8         return c.len>d.len;//优先队列原本是从大到小排列的,这里把小于号重载为特殊的大于号,使得队列中的元素从小到大出队,从而代替循环操作
 9     }
10     /*
11     bool operator<(const node &c)const
12     {
13         return len>c.len;
14     }
15     */
16 }now,next;
17 priority_queue<node>q;
18 int g[104][104];
19 int vis[104];
20 int n,m;
21 void dij()
22 {
23     while(!q.empty())
24     {
25         now=q.top();
26         q.pop();
27         if(now.pos==n)
28         {
29             printf("%d
",now.len);
30             while(!q.empty())
31                 q.pop();
32                 return;
33         }
34         if(vis[now.pos])continue;
35         vis[now.pos]=1;
36         for(int i=1;i<=n;i++)
37         {
38             if(g[now.pos][i]&&!vis[i])
39             {
40                 next.pos=i;
41                 next.len=g[now.pos][i]+now.len;
42                 q.push(next);
43             }
44         }
45     }
46 }
47 int main()
48 {
49     while(~scanf("%d%d",&n,&m)&&n&&m)
50     {
51         memset(g,-1,sizeof g);
52         for(int i=0;i<m;i++)
53         {
54             int u,v,l;
55             scanf("%d%d%d",&u,&v,&l);
56             if(g[u][v]==-1||l<g[u][v])
57                 g[u][v]=g[v][u]=l;
58         }
59         now.pos=1,now.len=1;
60         q.push(now);
61         dij();
62     }
63     return 0;
64 }

 

以上是关于迪杰斯特拉_优先队列 模板的主要内容,如果未能解决你的问题,请参考以下文章

优先队列下的迪杰斯特拉算法(结构体与队列的冲突)

优先队列优化dij算法通用模板

dijkstra算法模板(优先队列优化)

Dijkstra(迪杰斯特拉)模板

迪杰斯特拉/dijkstra 算法模板(具体凝视)

迪杰斯特拉算法介绍