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