在圖中,我們可以指定乙個點為起點,計算它到其餘各點的最短路徑。我們尋找乙個與它之間最近的點,以此為基礎不斷的更新它經過此點到其他點的最短路,並重複這個過程,直到所有的點都被尋找一遍。
#include#include#includeusing namespace std;
const int maxn = 100;
const int inf = 0x3f3f3f3f;
int map[maxn][maxn];
int dis[maxn];
bool vis[maxn];
int n, m;
void dijkstra()
} vis[k] = true;
for(int i = 1; i <= n; i++)
if(dis[i] > dis[k] + map[k][i])
dis[i] = dis[k] + map[k][i];
} return ;
}int main()
for(int i = 1; i <= n; i++)
dis[i] = map[1][i];
memset(vis, false, sizeof(vis));
vis[1] = true;
dijkstra();
for(int i = 1; i <= n; i++)
printf("%d ", dis[i]);
printf("\n");
} return 0;
}
加乙個小條件
在進行鬆弛(就是更新dis陣列)是,判斷一下從i 到k的值是否小於inf,在計算上沒什麼用,是用來判算i到k的2路是否存在.....
#include#include#includeusing namespace std;
const int maxn = 100;
const int inf = 0x3f3f3f3f;
int map[maxn][maxn];
int dis[maxn];
bool vis[maxn];
int n, m;
void dijkstra()
} vis[k] = true;
for(int i = 1; i <= n; i++)
}return ;
}int main()
for(int i = 1; i <= n; i++)
dis[i] = map[1][i];
memset(vis, false, sizeof(vis));
vis[1] = true;
dijkstra();
for(int i = 1; i <= n; i++)
printf("%d ", dis[i]);
printf("\n");
} return 0;
}
可以根據需要適當修改細節
注意 : dijkstra無法處理負權邊,接下來要用bellman-ford!!!!!!
迪傑斯特拉 Dijkstra
參考 迪傑斯特拉 dijkstra 演算法是典型最短路徑演算法,用於計算乙個節點到其他節點的最短路徑。它的主要特點是以起始點為中心向外層層擴充套件 廣度優先搜尋思想 直到擴充套件到終點為止。大概就是這樣乙個有權圖,dijkstra演算法可以計算任意節點到其他節點的最短路徑 演算法思路 指定乙個節點,...
Dijkstra 迪傑斯特拉
1 演算法思想 設g v,e 是乙個帶權有向圖,把圖中頂點集合v分成兩組 第一組為已求出最短路徑的頂點集合 用s表示,初始時s中只有乙個源點,以後每求得一條最短路徑 就將加入到 集合s中,直到全部頂點都加入到s中,演算法就結束了 第二組為其餘未確定最短路徑的頂點集合 用u表示 按最短路徑長度的遞增次...
Dijkstra(迪傑斯特拉)演算法
迪傑斯特拉 dijkstra 演算法是典型最短路徑演算法,用於計算乙個節點到其他節點的最短路徑。它的主要特點是以起始點為中心向外層層擴充套件 廣度優先搜尋思想 直到擴充套件到終點為止。指定乙個節點,例如我們要計算 a 到其他節點的最短路徑 引入兩個集合 s u s集合包含已求出的最短路徑的點 以及相...