最短路徑 之Dijkstra演算法

2021-07-28 21:29:25 字數 3076 閱讀 4754

dijkstra演算法

dijkstra() 

}}

//鄰接矩陣

int n, e[maxv][maxv];

int dis[maxv], pre[maxv];// pre用來標註當前結點的前乙個結點

bool vis[maxv] = ;

void dijkstra(int s)

}if(u == -1) return;

visit[u] = true;

for(int v = 0; v < n; v++)

}}}

//鄰接表

struct node

vectore[maxv];

int n;

int dis[maxv], pre[maxv];// pre用來標註當前結點的前乙個結點

bool vis[maxv] = ;

for(int i = 0; i < n; i++) pre[i] = i; //初始狀態設每個點的前驅為自身

void dijkstra(int s)

}if(u == -1) return ;

visit[u] = true;

for(int j = 0; j < e[u].size(); j++) }}}

void dfs(int s, int v)

dfs(s, pre[v]);

printf("%d\n", v);

}

三種附加考法:第一標尺是距離,如果距離相等的時候,新增第二標尺

if(visit[v] == false && e[u][v] != inf) else if(dis[u] + e[u][v] == dis[v] && c[u] + cost[u][v] < c[v]) 

}}

for(int v = 0; v < n; v++) else if(dis[u] + e[u][v] == dis[v] && w[u] + weight[v] > w[v]) 

}}

增加乙個陣列num,num[s] = 1,其餘num[u] = 0,表示從起點s到達頂點u的最短路徑的條數為num[u]

for(int v = 0; v < n; v++) else if(dis[u] + e[u][v] == dis[v]) 

}}

for(int v = 0; v < n; v++)  else if(dis[u] + e[u][v] == dis[v]) }}}

void printpath(int v)

printpath(pre[v]);

printf("%d ", v);

}

//dijkstra部分

if(dis[u] + e[u][v] < dis[v]) else if(dis[i] + e[u] == dis[v])

int optvalue;

vectorpre[maxv];

vectorpath, temppath;

void dfs(int v)

temppath.pop_back();

return ;

} temppath.push_back(v);

for(int i = 0; i < pre[v].size(); i++)

dfs(pre[v][i]);

temppath.pop_back();

}

計算當前temppath邊權或者點權之和的**:

// 邊權之和

int value = 0;

for(int i = tempptah.size() - 1; i > 0; i--)

// 點權之和

int value = 0;

for(int i = temppath.size(); i >= 0; i--)

#include #include #include using namespace std;

int n, m, s, d;

int e[510][510], dis[510], cost[510][510];

vectorpre[510];

bool visit[510];

const int inf = 99999999;

vectorpath, temppath;

int mincost = inf;

void dfs(int v)

if(tempcost < mincost)

temppath.pop_back();

return ;

}temppath.push_back(v);

for(int i = 0; i < pre[v].size(); i++)

dfs(pre[v][i]);

temppath.pop_back();

}int main()

pre[s].push_back(s);

dis[s] = 0;

for(int i = 0; i < n; i++)

}if(u == -1) break;

visit[u] = true;

for(int v = 0; v < n; v++) else if(dis[v] == dis[u] + e[u][v]) }}

}dfs(d);

for(int i = path.size() - 1; i >= 0; i--)

printf("%d ", path[i]);

printf("%d %d", dis[d], mincost);

return 0;

}//注意路徑path因為是從末端一直壓入push_back到path裡面的,所以要輸出路徑的時候倒著輸出

最短路徑 之Dijkstra演算法

dijkstra演算法dijkstra 鄰接矩陣 int n,e maxv maxv int dis maxv pre maxv pre用來標註當前結點的前乙個結點 bool vis maxv void dijkstra int s if u 1 return visit u true for in...

最短路徑之Dijkstra演算法

using system namespace dijkstra演算法 路徑圖 static int places int math.sqrt map.length 獲取地點數 static int shortest new int places 存放從start到其他節點的最短路徑 static b...

最短路徑之Dijkstra演算法

這裡,我們想要得出節點a 節點1 到節點b 節點5 的最短路徑,就是怎麼走可以使得權重值的和最小,每一條邊都有乙個權重。今天我們介紹的d演算法就是解決這類問題的,這是一種貪心演算法,每次只取權重和最小的點,通過不斷加入節點,來更新源節點a到各個節點的最短路徑,直到所有節點遍歷完。演算法步驟 1 定義...