Dijkstra 最短路徑

2021-06-20 01:28:28 字數 4146 閱讀 8532

dijkstra 最短路徑:針對有向圖,不支援負權值

// 圖的相鄰矩陣表示方法,還要用到最小值堆

#include #include #define unvisited 0

#define visited 1

#define infinite 9999 //設定最大值

#define n 5 // 定義圖的頂點數

using namespace std;

//edge

class edge

; // 建構函式

edge(int f,int t,int w) // 建構函式

bool operator < (const edge &arg)

;bool operator == (const edge &arg)

;bool operator > (const edge &arg)

;bool operator <= (const edge &arg)

;bool operator >= (const edge &arg)

;};// 圖基類

class graph

};~graph() //析構函式

;virtual edge firstedge(int onevertex) // 返回與頂點onevertex相關聯的第一條邊

;virtual edge nextedge(edge preedge) // 返回與邊preedge有相同關聯頂點的下一條邊

;int verticesnum() //返回圖的頂點個數

;int edgesnum() //返回圖的邊數

;int fromvertex(edge oneedge) // 返回oneedge的始點

;int tovertex(edge oneedge) // 返回oneedge的終點

;int weight(edge oneedge) // 返回oneedge的權值

;bool isedge(edge oneedge) //如果oneedge是邊則返回true,否則返回false

;virtual void setedge(int from, int to, int weight) = 0;

virtual void deledge(int from, int to) = 0;

};// 圖的相鄰矩陣表示法

class graphm:public graph

; ~graphm() //析構函式

;edge firstedge(int onevertex) //返回頂點onevertex的第一條邊

}return myedge;

/*如果找到了頂點onevertex的第一條邊,則返回的myedge確實是一條邊;如果沒有找到頂點onevertex的第一條邊,則myedge的成員變數to為-1,根據isedge函式判斷可知myedge不是一條邊*/

};edge nextedge(edge preedge) //返回與邊preedge有相同關聯頂點的下一條邊}}

return myedge; /*如果找到了頂點preedge.from的下一條邊,則返回的myedge確實是一條邊;如果沒有找到頂點preedge.from的下一條邊,則myedge的成員變數to為-1,

根據isedge函式判斷可知myedge不是一條邊*/

}void setedge(int from, int to, int weight) //為圖設定一條邊

matrix[from][to] = weight;

};void deledge(int from,int to) //刪除圖的一條邊

matrix[from][to]=0;

}};// 函式功能:顯示頂點

void graphm::visit(graph &g, int v)

// 函式功能:初始化圖

void graphm::inigraphm(graphm *graphm, int a[n][n])

}}/******************** **5.17 堆的類定義和篩選法 ******************/

#define false 0

#define true 1

template class minheap //最小堆類定義

; //析構函式

bool isleaf(int pos) const; //如果是葉結點,返回true

int leftchild(int pos) const; //返回左孩子位置

int rightchild(int pos) const; //返回右孩子位置

int parent(int pos) const; //返回父結點位置

bool remove(int pos, t& node); //刪除給定下標的元素

bool insert(const t& newnode); //向堆中插入新元素newnode

t& removemin(); //從堆頂刪除最小值

void siftup(int position); //從position向上開始調整,使序列成為堆

void siftdown(int left); //篩選法函式,引數left表示開始處理的陣列下標

bool isempty()

;};templateminheap::minheap(const int n)

templatebool minheap::isleaf(int pos) const

templateint minheap::leftchild(int pos) const

templateint minheap::rightchild(int pos) const

templateint minheap::parent(int pos) const

template bool minheap::insert(const t& newnode) //向堆中插入新元素newnode

templatevoid minheap::siftup(int position) //從position向上開始調整,使序列成為堆

heaparray[temppos]=temp;

}templatevoid minheap::swap(int pos_x, int pos_y) //交換位置x和y的元素

templatet& minheap::removemin() //從堆頂刪除最小值

else

}templatebool minheap::remove(int pos, t& node) // 刪除給定下標的元素

template void minheap::siftdown(int left)

else break;

}heaparray[i]=temp;

}//[**7.8] dijkstra演算法

class dist //定義dist類,下面的dijkstra演算法和floyd演算法要用到

; ~dist() {};

bool operator < (const dist & arg)

bool operator == (const dist &arg)

bool operator > (const dist &arg)

bool operator <=(const dist &arg)

bool operator >= (const dist &arg)

};//dijkstra演算法,其中引數g是圖,引數s是源頂點,d是儲存最短距離及其路徑的陣列

void dijkstra(graphm& g, int s, dist* &d)

d[s].length = 0;

minheaph(g.edgesnum()); // 最小值堆(minheap)

h.insert(d[s]);

for (int i = 0; i < g.verticesnum(); i++)

}}int a[n][n] = //圖7.20 單源最短路徑的示例

;int main()

dijkstra最短路徑

hehe和xixi在乙個地方玩遊戲,xixi把n 1件禮物 hehe以前送給xixi的 分別藏在了另外n 1個地方,這些地方都能互相到達,且所有的邊都是有方向的。現在hehe要做的事就是去那些地方找回那n 1件禮物給xixi 由於每一件禮物都有特殊的意義,所以xixi要求hehe每找到一件禮物,就必...

最短路徑 Dijkstra

首先,提出兩點 一 如果把不帶權圖上的所有邊的權值均定義為1,則該不帶權圖可以歸結為帶權圖 二 如果把無向圖中的每一條邊 vi,vj 都定義為弧和弧,則該無向圖可以歸結為有向圖。因此不失一般性,我們只用看有向帶權圖怎麼求解最短路徑問題就ok。帶權圖中,從乙個結點到另個一結點存在著多條路徑,稱每一條路...

Dijkstra最短路徑

演算法筆記 dijkstra演算法解決的是單源最短路問題,即給定圖g v,e 和起點s 起點又稱為源點 求從起點s到達其它頂點的最短距離 dijkstra演算法的策略是 設定集合s存放已被訪問的頂點,然後執行n次下面的兩個步驟 n為頂點個數 1.每次從集合v s中選擇與起點s的最短距離最小的乙個頂點...