HDU2544 最短路dij

纯最短路。

  1 ///HDU 2544堆优化的最短路
  2 #include <cstdio>
  3 #include <iostream>
  4 #include <sstream>
  5 #include <cmath>
  6 #include <cstring>
  7 #include <cstdlib>
  8 #include <string>
  9 #include <vector>
 10 #include <map>
 11 #include <set>
 12 #include <queue>
 13 #include <stack>
 14 #include <algorithm>
 15 using namespace std;
 16 #define ll long long
 17 #define _cle(m, a) memset(m, a, sizeof(m))
 18 #define repu(i, a, b) for(int i = a; i < b; i++)
 19 #define repd(i, a, b) for(int i = b; i >= a; i--)
 20 #define sfi(n) scanf("%d", &n)
 21 #define pfi(n) printf("%d\n", n)
 22 const int MAXN = 2200;
 23 const int MAXM = 20200;
 24 const int INF=0x3f3f3f3f;
 25 struct Node
 26 {
 27     int to,next,w;
 28 } edge[MAXM];
 29 struct HeapNode
 30 {
 31     int d, u;
 32     bool operator < (const HeapNode& rhs) const
 33     {
 34         return d > rhs.d;
 35     }
 36 };
 37 struct Dijkstra
 38 {
 39     int head[MAXN],d[MAXN];
 40     bool done[MAXN];
 41     int cnt;
 42     void init()
 43     {
 44         memset(head,-1,sizeof(head));
 45         cnt = 0;
 46     }
 47     void AddEdge(int u, int v, int w)
 48     {
 49         edge[cnt].to=v,edge[cnt].next=head[u];
 50         edge[cnt].w=w,head[u]=cnt++;
 51         edge[cnt].to=u,edge[cnt].next=head[v];
 52         edge[cnt].w=w,head[v]=cnt++;
 53     }
 54     void dijkstra(int s,int n)
 55     {
 56         priority_queue<HeapNode> Q;
 57         for(int i = s; i <= n; i++)
 58             d[i] = INF;
 59         d[s] = 0;
 60         memset(done, 0, sizeof(done));
 61         Q.push((HeapNode)
 62         {
 63             0, s
 64         });
 65         while(!Q.empty())
 66         {
 67             HeapNode x = Q.top();
 68             Q.pop();
 69             int u = x.u;
 70             if(done[u]) continue;
 71             done[u] = true;
 72             for(int i=head[u]; i!=-1; i=edge[i].next)
 73             {
 74                 int v=edge[i].to;
 75                 if(d[v] > d[u] + edge[i].w)
 76                 {
 77                     d[v] = d[u] + edge[i].w;
 78                     Q.push((HeapNode)
 79                     {
 80                         d[v], v
 81                     });
 82                 }
 83             }
 84         }
 85     }
 86 } dij;
 87 int main()
 88 {
 89     int n,m,a,b,c;
 90     while(scanf("%d%d",&n,&m),n+m)
 91     {
 92         dij.init();
 93         repu(i,0,m)
 94         {
 95             scanf("%d%d%d",&a,&b,&c);
 96             dij.AddEdge(a,b,c);
 97             dij.AddEdge(b,a,c);
 98         }
 99         dij.dijkstra(1,n);
100         printf("%d\n",dij.d[n]);
101     }
102     return 0;
103 }

堆优化的Dij

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstdlib>
 4 #include <algorithm>
 5 #include <cstring>
 6 #include <cmath>
 7 #include <vector>
 8 #include <queue>
 9 #include <stack>
10 #include <set>
11 #include <map>
12 using namespace std;
13 const int maxn=2200;
14 const int INF=0x3f3f3f3f;
15 struct Edge
16 {
17     int u, v, d;
18     Edge(int u, int v, int d):u(u), v(v), d(d) {}
19 };
20 struct qnode
21 {
22     int u,d;
23     qnode(int u, int d):u(u), d(d) {}
24     bool operator < (const qnode a)const
25     {
26         return d>a.d;
27     }
28 };
29 struct Dijkstra
30 {
31     int n;
32     vector<int> G[maxn];
33     vector<Edge> edge;
34     int d[maxn];
35     bool vis[maxn];
36     void init(int n)
37     {
38         this->n = n;
39         for(int i=0; i<=n; i++)
40         {
41             G[i].clear();
42             vis[i]=0;
43             d[i]=INF;
44         }
45         edge.clear();
46     }
47     void AddEdge(int u, int v, int d)
48     {
49         G[u].push_back(edge.size());
50         edge.push_back(Edge(u, v, d));
51     }
52     void dijkstra(int s)
53     {
54         priority_queue<qnode> q;
55         d[s]=0;
56         q.push(qnode(s, 0));
57         while(!q.empty())
58         {
59             qnode x=q.top();
60             q.pop();
61             if(vis[x.u])
62                 continue ;
63             vis[x.u]=true;
64             for(int i=0; i<G[x.u].size(); i++)
65             {
66                 Edge& e=edge[G[x.u][i]];
67                 if(d[e.v]>d[x.u]+e.d)
68                 {
69                     d[e.v]=d[x.u]+e.d;
70                     q.push(qnode(e.v, d[e.v]));
71                 }
72             }
73         }
74     }
75 } dij;
76
77 int main()
78 {
79     int n, m;
80     while(scanf("%d%d", &n, &m),n+m)
81     {
82         dij.init(n);
83         while(m--)
84         {
85             int u, v, w;
86             scanf("%d%d%d", &u, &v, &w);
87             dij.AddEdge(u, v, w);
88             dij.AddEdge(v, u, w);
89         }
90         dij.dijkstra(1);
91         printf("%d\n",dij.d[n]);
92     }
93     return 0;
94 }

邻接矩阵Dij

本来以为这两个时间效率相差会很大,看来只在稠密图中奏效。

当图稠密起来后一般需要用堆优化的dijkstra。。。

时间: 2024-11-11 06:48:18

HDU2544 最短路dij的相关文章

HDU2544,最短路

最短路 Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 31960    Accepted Submission(s): 13849 Problem Description 在每年的校赛里,所有进入决赛的同学都会获得一件很漂亮的t-shirt.但是每当我们的工作人员把上百件的衣服从商店运回到赛场的时候,却是非常累的!所以现在他们想要寻找

HDU2544 最短路 【Dijkstra】

最短路 Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 31182    Accepted Submission(s): 13456 Problem Description 在每年的校赛里,所有进入决赛的同学都会获得一件很漂亮的t-shirt.但是每当我们的工作人员把上百件的衣服从商店运回到赛场的时候,却是非常累的!所以现在他们想要寻找

HDU2544最短路

最短路 Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 32036    Accepted Submission(s): 13893 Problem Description 在每年的校赛里,所有进入决赛的同学都会获得一件很漂亮的t-shirt.但是每当我们的工作人员把上百件的衣服从商店运回到赛场的时候,却是非常累的!所以现在他们想要寻找

hdu--2544--题如其名&lt;最短路&gt;--dij&lt;priority_queue&gt;||spfa&lt;queue&gt;

这题 让我深刻地 感受到了 题如其名 =-= ......... 一直以来都写spfa 这次 也顺便写了下 dij<链式前向星&&priority_queue> 代码太长了.. 但是 要是思路清晰的话 写下去的感觉很爽的... 当然 我还是更加喜欢 spfa 关于 链式前向星 可以---传送--出产地学习 关于 spfa -- 我没找到特别出色的介绍<我也写过..> 这个不难 你可以随便去找一篇来学习 关于 dij -- 也是图论的入门重要算法 介绍它的博客实在太多

HDU 6071 Lazy Running (同余最短路 dij)

Lazy Running Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 524288/524288 K (Java/Others)Total Submission(s): 1384    Accepted Submission(s): 597 Problem Description In HDU, you have to run along the campus for 24 times, or you will fail in

最短路-dij

最短路,也是单源最短路,能够求出从一个点到达其他所有点的最短距离(n是点,m是边E是不确定) 算法有 Dij(O(n2)很稳定)  SPFA(O(nE到nm),据说有很多优化方案,但每种方案又有对应卡你过不去的策略,不建议使用但是据说网络流必须用他) Floyd(O(n3),内部含有dp思想,平时90%不用)Bellman主要判断是否有负环(O(nm)) Dij+堆(O(mlgm)以后解决最短路常用方法,高效又稳定) 其中Dij主要用于正权图,如果有负环需要用SPFA或Bellman 说一下DI

HDU2544 最短路【Dijkstra算法】

最短路 Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 34628    Accepted Submission(s): 15003 Problem Description 在每年的校赛里,所有进入决赛的同学都会获得一件很漂亮的t-shirt.但是每当我们的工作人员把上百件的衣服从商店运回到赛场的时候,却是非常累的!所以现在他们想要寻找

[hdu2544]最短路spfa

解题关键:最短路模板一直没整理过,这里整理了一下spfa+链式前向星建图的最短路模板,以后网络赛省的打了. spfa算法的关键就是松弛操作,只有进行松弛操作,其后的点距离才可能被更新. 1 #include<bits/stdc++.h> 2 using namespace std; 3 const int inf=0x3f3f3f3f; 4 const int maxm=11111; 5 const int maxn=111; 6 int head[maxn],tot,n,m; 7 struc

HDU2544 最短路 Bellman-Ford实现

Problem Description 在每年的校赛里,所有进入决赛的同学都会获得一件很漂亮的t-shirt.但是每当我们的工作人员把上百件的衣服从商店运回到赛场的时候,却是非常累的!所以现在他们想要寻找最短的从商店到赛场的路线,你可以帮助他们吗? Input 输入包括多组数据.每组数据第一行是两个整数N.M(N<=100,M<=10000),N表示成都的大街上有几个路口,标号为1的路口是商店所在地,标号为N的路口是赛场所在地,M则表示在成都有几条路.N=M=0表示输入结束.接下来M行,每行包