迪杰斯特拉算法(Dijkstra)

模板一:

时间复杂度O(n2

 1 int dijkstra(int s,int m)  //s为起点,m为终点
 2 {
 3     memset(dist,0,sizeof(dist));   //初始化,dist数组用来储存s到各个点的距离
 4     memset(v,0,sizeof(v));         //初始化v数组,是否已标记
 5     for(int i=1;i<=n;++i)          //++i返回的是引用,稍微快一点
 6     {
 7         dist[i]=e[s][i];           //初始化,e[s][i]数组表示是点s到点i的权值,数组e用来存有向图或无向图的权值,用INF初始化
 8     }
 9     for(int i=1;i<=n;++i)
10     {
11         k=INF,u=0;
12         for(int j=1;j<=n;++j)      //找出当前dist最小的点
13         {
14             if(!v[j]&&dist[j]<k)
15             {
16                 k=dist[j];
17                 u=j;
18             }
19         }
20         v[u]=1;                    //标记
21         for(int j=1;j<=n;++j)      //更新与点u相连的点的权值和
22         {
23             if(!v[j]&&e[u][j]<INF&&dist[u]+e[u][j]<dist[j])    //比较从点s到点u载到点j的权值和点s直接到点j的权值
24             {
25                 dist[j]=dist[u]+e[u][j];
26             }
27         }
28     }
29     return dist[m];  
30 }

模板二:

时间复杂度 O(mlogn)m为边数,n为顶点数。

对于稀疏图的效果显著,对稠密图慎用。

 1 const int maxn=100005;
 2 struct Edge
 3 {
 4     int from,to,dist;
 5     Edge(int u,int v,int d):from(u),to(v),dist(d){}
 6 };
 7 struct HeapNode
 8 {
 9     int d,u;
10     bool operator < (const HeapNode& rhs) const {
11         return d>rhs.d;
12     }
13 };
14 struct Dijkstra
15 {
16     int n,m;
17     vector<Edge> edges;
18     vector<int> G[maxn];    //maxn要大于顶点数
19     bool done[maxn];
20     int d[maxn];
21     int p[maxn];
22 
23     void init(int n)
24     {
25         this->n=n;
26         for(int i=0;i<n;++i)
27             G[i].clear();
28         edges.clear();
29     }
30 
31     void addEdge(int from,int to,int dist)
32     {
33         edges.push_back(Edge(from,to,dist));
34         m=edges.size();
35         G[from].push_back(m-1);
36     }
37 
38     void dijkstra(int s)
39     {
40         priority_queue<HeapNode> Q;
41         for(int i=0;i<n;++i)
42             d[i]=INF;
43         d[s]=0;
44         memset(done,0,sizeof(done));
45         Q.push((HeapNode){0,s});
46         while(!Q.empty())
47         {
48             HeapNode x=Q.top();
49             Q.pop();
50             int u=x.u;
51             if(done[u])
52             {
53                 continue;
54             }
55             done[u]=true;
56             for(int i=0;i<G[u].size();++i)
57             {
58                 Edge& e=edges[G[u][i]];
59                 if(d[u]+e.dist<d[e.to])
60                 {
61                     d[e.to]=d[u]+e.dist;
62                     p[e.to]=G[u][i];
63                     Q.push((HeapNode){d[e.to],e.to});
64                 }
65             }
66         }
67     }
68 
69 };

 在c++和gcc环境下提交会报错,g++不会,持续更新……

猜你喜欢

转载自www.cnblogs.com/Nicholas-Rain/p/10941323.html