迪杰斯特拉算法:
在一个图里 ,给定一个源点,计算从源点到每个点之间的最短路径。
#include
#include
#include
using namespace std;
const int V = 9; //定义顶点个数
//从未包含在SPT的集合T中,选取一个到S集合的最短距离的顶点。
int getMinIndex(int dist[V], bool sptSet[V]) {
int min = INT_MAX, min_index;
for (int v = 0; v < V; v++)
if (sptSet[v] == false && dist[v] < min)
min = dist[v], min_index = v;
return min_index;
}
// 打印结果
void printSolution(int dist[], int n) {
printf("Vertex Distance from Source\n");
for (int i = 0; i < V; i++)
printf("%d \t\t %d\n", i, dist[i]);
}
//source 代表源点
void dijkstra(int graph[V][V], int source) {
int dist[V]; // 存储结果,从源点到 i的距离
bool sptSet[V]; // sptSet[i]=true 如果顶点i包含在SPT中
// 初始化. 0代表不可达
for (int i = 0; i < V; i++){
dist[i] = (graph[source][i] == 0 ? INT_MAX:graph[source][i]);
sptSet[i] = false;
}
// 源点,距离总是为0. 并加入SPT
dist[source] = 0;
sptSet[source] = true;
// 迭代V-1次,因此不用计算源点了,还剩下V-1个需要计算的顶点。
for (int count = 0; count < V - 1; count++) {
// u,是T集合中,到S集合距离最小的点
int u = getMinIndex(dist, sptSet);
// 加入SPT中
sptSet[u] = true;
//更新到V的距离。可以理解为Bellman-Ford中的松弛操作
for (int v = 0; v < V; v++)
if (!sptSet[v] && graph[u][v] && dist[u] != INT_MAX
&& dist[u] + graph[u][v] < dist[v])
dist[v] = dist[u] + graph[u][v];
}
printSolution(dist, V);
}
int main() {
/* 以例子中的图为例 */
int graph[V][V] =
{ { 0, 4, 0, 0, 0, 0, 0, 8, 0 }, { 4, 0, 8, 0, 0, 0, 0, 11, 0 }, {
0, 8, 0, 7, 0, 4, 0, 0, 2 }, { 0, 0, 7, 0, 9, 14, 0, 0, 0 },
{ 0, 0, 0, 9, 0, 10, 0, 0, 0 },
{ 0, 0, 4, 0, 10, 0, 2, 0, 0 },
{ 0, 0, 0, 14, 0, 2, 0, 1, 6 },
{ 8, 11, 0, 0, 0, 0, 1, 0, 7 },
{ 0, 0, 2, 0, 0, 0, 6, 7, 0 } };
dijkstra(graph, 0);
return 0;
}
代码参考:
#include
#include
const int N=207;
const int inf=1e7;
using namespace std;
int dist1[N];
int dist0[N];
int visited[N];
int edge1[N][N];
int edge0[N][N];
int n,m,k;
void Dijkstra1(int u){
memset(visited,0,sizeof(visited));
for(int i=1;i<=n;i++){
dist1[i]=edge1[u][i];
}
visited[u]=1;
for(int i=1;i
迪杰斯特拉算法有点类是贪心算法,
不过它的“目光短浅”限制它只能处理权非负数的图,
每次很久不看后就很难看懂那个更新源点到各个点之间最短路径的代码
------------------------------------------------------------------------------------------------------------------------------
后续更新 3/29
杭电2066:传送门
参考代码:
#include
#include
#define M 1000000
int dij[1010],s[1010];
int road[1010][1010];
int Max(int a,int b)
{
return a>b?a:b;
}
int Min(int a,int b)
{
return az)
road[x][y]=road[y][x]=z;
if(Max(x,y)>n)
n=Max(x,y);
}
for(i=0;i
这题的算法方式和前面的两个有点不一样,判断条件较少