• Dijkstra(优先队列优化)


     1 /*
     2 Dijkstra的算法思想:
     3 在所有没有访问过的结点中选出dis(s,x)值最小的x
     4 对从x出发的所有边(x,y),更新
     5 dis(s,y)=min(dis(s,y),dis(s,x)+dis(x,y))
     6 */
     7 #include <iostream>
     8 #include <cstdio>
     9 #include <queue>
    10 #include <vector>
    11 using namespace std;
    12 const int Ni = 10000;
    13 const int INF = 1<<27;
    14 struct node{
    15     int x,d;
    16     node(){}
    17     node(int a,int b){x=a;d=b;}
    18     bool operator < (const node & a) const
    19     {
    20         if(d==a.d) return x<a.x;
    21         else return d > a.d;
    22     }
    23 };
    24 vector<node> eg[Ni];
    25 int dis[Ni],n;
    26 void Dijkstra(int s)
    27 {
    28     int i;
    29     for(i=0;i<=n;i++) dis[i]=INF;
    30     dis[s]=0;
    31     //用优先队列优化
    32     priority_queue<node> q;
    33     q.push(node(s,dis[s]));
    34     while(!q.empty())
    35     {
    36         node x=q.top();q.pop();
    37         for(i=0;i<eg[x.x].size();i++)
    38         {
    39             node y=eg[x.x][i];
    40             if(dis[y.x]>x.d+y.d)
    41             {
    42                 dis[y.x]=x.d+y.d;
    43                 q.push(node(y.x,dis[y.x]));
    44             }
    45         }
    46     }
    47 }
    48 int main()
    49 {
    50     int a,b,d,m;
    51     while(scanf("%d%d",&n,&m),n+m)
    52     {
    53         for(int i=0;i<=n;i++) eg[i].clear();
    54         while(m--)
    55         {
    56             scanf("%d%d%d",&a,&b,&d);
    57             eg[a].push_back(node(b,d));
    58             eg[b].push_back(node(a,d));
    59         }
    60         Dijkstra(1);
    61         printf("%d\n",dis[n]);
    62     }
    63     return 0;
    64 }
    65 /*
    66 6 6
    67 1 2 2
    68 3 2 4
    69 1 4 5
    70 2 5 2
    71 3 6 3
    72 5 6 3
    73 */
  • 相关阅读:
    并发编程(IO多路复用)
    411. 格雷编码
    120. 单词接龙 (BFS)
    1244. Minimum Genetic Mutation
    47.Majority Element I & II
    86. 二叉查找树迭代器
    1183. 排序数组中的单个元素
    163. 不同的二叉查找树
    428.x的n次幂
    156. 合并区间
  • 原文地址:https://www.cnblogs.com/qijinbiao/p/2711780.html
Copyright © 2020-2023  润新知