算法基础——dijkstra算法

 发现时间久了脑子稍微有点糊,今天不想总结新的面试知识了,为了保持工作热度,回顾一下以前学习的知识。所以在在这里稍微总结一下迪杰斯特拉算法。也称最短路算法。

一 基础版n^2实现

1
2
3
4
5
6
7
8
9
10
11
12
memset(v, 0, sizeof(v)); 
for(int i = 0; i < n; i++)
d[i] = (i==0 ? 0 : INF);
for(int i = 0; i < n; i++) {
int x, m = INF;
for(int y = 0; y < n; y++)
if(!v[y] && d[y] <= m)
m = d[y], x = y;
v[x] = 1;
for(int y = 0; y < n; y++)
d[y] = min(d[y], d[x] + w[x][y]);
}

二 利用边集和优先级队列Mlog(N)实现

 首先需要定义边,边的定义如下。

1
2
3
4
5
6
struct DistNode {
int d, u;
bool operator < (const HeapNode& rhs) const {
return d > rhs.d; //这样一来,队列中在最顶层的是最小值
}
}

 使用优先级队列进行优化。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
priority_queue<Node> q;
memset(vis,0,sizeof(vis));
for(int i = 1;i <= n;i++)
d[i] = INF;
d[1] = 0;
q.push(make_pair(d[1],1));
while(!q.empty()) {
Node t = q.top();q.pop();
if(vis[t.second])continue;
vis[t.second] = 1;
for(int i = 1;i <= n;i++)
if(!vis[i] && d[i] > t.first+G[t.second][i]) {
d[i] = t.first+G[t.second][i];
q.push(make_pair(d[i],i));
}
}

 算法比较简单暂时先不做过多的讲解,然后更新这个主要还有一个原因就是回家了但是不想划水太严重。所以暂时先更新这个不带过多讲解的版本啦。等23号正式开始给暑期集训讲课的时候在对内容进行更深一步的优化。

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×