1、对于每条边仅松弛一次
2、复杂度低于Bellmall-Ford
3、边的权重为非负值
4、时间复杂度O(V*lgV)
INITIALIZE-SINGLE-SOURCE(G,s)
for ecah vertex v属于G.V
v.d=MAXINT
v.prev=NULL
s.d=0
伪码:
DIJKSTRA(G,w,s)
INITIALIZE-SINGLE-SOURCE(G,s)
S=NULL
Q=G.V
while Q!=NULL
u=EXTRACT-MIN(Q)
S=S U {u}
for each vertex v属于G.Adj[u]
RELAX(u,v,w)
c++实现:
namespace A{
int prev[100];//各个节点的前驱节点
int dist[100];//各个节点到源节点的最短距离
int c[100][100];//用临接矩阵表示图
bool s[100];//表示节点是否已经加入S集合
int nodenum;//节点个数
int line;//边的条数
int startnode;//源节点
int src, dst, weight;
const int MAXINT = 9999;
void init()
{
cout << "输入节点个数:"; cin >> nodenum;
cout << "输入边的条数:"; cin >> line;
cout << "输入源节点编号:"; cin >> startnode;
for (int i = 1; i <= nodenum; ++i){
for (int j = 1; j <= nodenum; ++j)
c[i][j] = MAXINT;
}
cout << "输入" << line << "行src dst wight:";
for (int i = 1; i <= line; ++i){
cin >> src >> dst >> weight;
c[src][dst] = weight;
//c[dst][src]=weight;//无向图
}
for (int i = 1; i <= nodenum; ++i){
dist[i] = c[startnode][i];
if (dist[i] == MAXINT)
prev[i] = -1;
else
prev[i] = startnode;
}
dist[startnode] = 0;
for (int i = 1; i <= nodenum; ++i){
s[i] = false;
}
s[startnode] = true;
}
void Dijkstra()
{
init();
int scount = 1;
while (scount < nodenum){
int tmp = MAXINT;
int u;
for (int i = 1; i <= nodenum; ++i){
if (s[i] == false && dist[i] < tmp) {
tmp = dist[i];
u = i;
}
}
s[u] = true;
for (int i = 1; i <= nodenum; ++i){
if (s[i] == false && c[u][i] < MAXINT&&c[u][i] + tmp < dist[i]){
dist[i] = c[u][i] + tmp;
prev[i] = u;
}
}
++scount;
}
}
};
int main()
{
A::Dijkstra();
for (int i = 1; i <= A::nodenum; ++i)
cout << A::dist[i] << " ";
cout << endl;
system("pause");
return 0;
}
测试用例:
5
7
1
1 2 10
1 4 30
1 5 100
2 3 50
3 5 10
4 3 20
4 5 60
《完》
转载于:https://blog.51cto.com/lingdandan/1924753