聯想 ThinkPad X1 Titanium Yoga 海外上市:約 19000 元起
阿新 • • 發佈:2021-01-30
技術標籤:資料結構與演算法
主要思想
- 在未被訪問的陣列中 找到可達距離最小的點,將其納入訪問集合
- 基於第一步找到的點為中介點,更新可達點的最短距離
程式碼
#include<stdio.h>
#include<algorithm>
#include<string.h>
#include<vector>
using namespace std;
const int maxv = 1000;
const int INF = 1000000000;
int n, G[maxv][maxv];
int d[maxv]; // 記錄起點到各點的最短路徑
bool vis[ maxv] = {false};
struct Node
{
int v; // 邊的目標頂點
int dis; // 邊權
};
vector<Node> Adj[maxv];
void Dijkstra_Matrix(int start)
{
fill(d, d + maxv, INF);
d[start] = 0;
for (int i = 0; i < n; i++)
{
int u = -1, MIN = INF;
for (int j = 0; j < n; j++)
{
if (vis[j] == false && d[i] < MIN)
{
u = j;
MIN = d[j]; // 找未訪問集合中距離最短的點
}
}
if(u == -1)
return; // 找不到,說明剩下的頂點與起點不連通
vis[u] = true; // 得到中介點
for (int v = 0; v < n; v++)
{
if(vis[v] == false && G[u][v] != INF && (d[u] + G[u][v] < d[v]))
{ // 點v未納入中介點集合 且 中介點到v的路徑存在 且 s經中點到 v的距離更小
d[v] = d[u] + G[u][v];
}
}
}
}
void Dijkstra_Table(int start)
{
fill(d, d + maxv, INF);
d[start] = 0;
for (int i = 0; i < n; i++)
{
int u = -1, MIN = INF;
for (int j = 0; j < n; j++)
{
if(vis[j] == false && d[j] < MIN)
{
u = j;
MIN = d[j];
}
}
if(u == -1)
return;
vis[u] = true;
for (int j = 0; j < Adj[u].size(); j++)
{
int v = Adj[u][j].v;
if(vis[v] == false && d[u] + Adj[u][j].dis < d[v])
{
d[v] = d[u] + Adj[u][j].dis;
}
}
}
}