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 */

 

 

你可能感兴趣的:(dijkstra)