1. 程式人生 > 資訊 >聯想 ThinkPad X1 Titanium Yoga 海外上市:約 19000 元起

聯想 ThinkPad X1 Titanium Yoga 海外上市:約 19000 元起

技術標籤:資料結構與演算法

主要思想

  1. 在未被訪問的陣列中 找到可達距離最小的點,將其納入訪問集合
  2. 基於第一步找到的點為中介點,更新可達點的最短距離

程式碼

#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; } } } }