最短路徑問題演算法

2021-08-01 09:00:22 字數 3323 閱讀 5105

dijksatr演算法是典型最短路演算法,用於計算乙個節點到其他所有節點的最短路徑,主要特點是以起始點為中心向外層層擴充套件,直到拓展到終點為止。
設g=(v,e)是乙個帶權有向圖,把圖中頂點集合v分成兩組,第一組為已求出最短路徑的頂點集合(用s表示,初始時s中只有乙個源點,以後每求得一條最短路徑 , 就將加入到集合s中,直到全部頂點都加入到s中,演算法就結束了),第二組為其餘未確定最短路徑的頂點集合(用u表示),按最短路徑長度的遞增次序依次把第二組的頂點加入s中。在加入的過程中,總保持從源點v到s中各頂點的最短路徑長度不大於從源點v到u中任何頂點的最短路徑長度。此外,每個頂點對應乙個距離,s中的頂點的距離就是從v到此頂點的最短路徑長度,u中的頂點的距離,是從v到此頂點只包括s中的頂點為中間頂點的當前最短路徑長度。
dijkstra 單源最短路 鄰接矩陣形式
/*

* 單源最短路徑,dijkstra演算法,鄰接矩陣形式,複雜度為o(n^2)

* 求出源beg到所有點的最短路徑,傳入圖的頂點數和鄰接矩陣cost

* 返回各點的最短路徑lowcost,路徑pre,pre[i]記錄beg到i路徑上的父節點,pre[beg] = -1

* 可更改路徑權型別,但是權值必須為非負,下標0~n-1

*/const

int maxn = 1010;

const

int inf = 0x3f3f3f3f; // 表示無窮

bool vis[maxn];

int pre[maxn];

void dijkstra(int cost[maxn], int lowcost, int n, int beg)

lowcost[beg] = 0;

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

}if (k == -1)

vis[k] = true;

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

}

dijkstra 單源最短路 鄰接矩陣形式 雙路徑資訊
/*

* 單源最短路徑,dijkstra演算法,鄰接矩陣形式,複雜度為o(n^2)

* 兩點間距離存入map,兩點間花費存入cost

* 求出源st到所有點的最短路徑及其對應最小花費

* 返回各點的最短路徑lowdis以及對應的最小花費lowval

* 可更改路徑權型別,但是權值必須為非負,下標1~n

*/const

int maxn = 1010;

const

int inf = 0x3f3f3f3f;

int n, m;

int lowdis[maxn];

int lowval[maxn];

int visit[maxn];

intmap[maxn][maxn];

int cost[maxn][maxn];

void dijkstra(int st)

memset(visit, 0, sizeof(visit));

visit[st] = 1;

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

}visit[temp] = 1;

for (int j = 1; j <= n; j++)

else

if (lowdis[j] == lowdis[temp] + map[temp][j])}}

}}

return ;

}

dijkstra 起點start 結點有權值
#define m 505

const

int inf = 0x3f3f3f3f;

int num[m]; // 結點權值

intmap[m][m]; // 圖的臨近矩陣

int vis[m]; // 結點是否處理過

int ans[m]; // 最短路徑結點權值和

int dis[m]; // 各點最短路徑花費

int n, m, start, end; // n結點數,m邊數,start起點,end終點

void dij(int v)

dis[i] = map[v][i];

}dis[v] = 0;

vis[v] = 1;

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

}vis[u] = 1;

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

}for (int k = 0; k < n; ++k)}}

printf("%d %d\n", dis[end], ans[end]); // 輸出終點最短路徑花費、最短路徑結點權值和

}int main()

memset(vis, 0, sizeof(vis));

memset(map, 0x3f, sizeof(map));

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

}dij(start);

return

0;}

dijkstar 堆優化
/* 

* 使用優先佇列優化dijkstra演算法

* 複雜度o(elonge)

* 注意對vectore[maxn]進行初始化後加邊

*/const

int inf = 0x3f3f3f3f;

const

int maxn = 1000010;

struct qnode

bool

operator

< (const qnode &r) const

};struct edge

};vector

e[maxn];

bool vis[maxn];

int dist[maxn]; // 最短路距離

void dijkstra(int n, int start) // 點的編號從1開始

dist[start] = 0;

que.push(qnode(start, 0));

qnode tmp;

while (!que.empty())

vis[u] = true;

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

}void addedge(int u, int v, int w)

最短路徑演算法 最短路

在每年的校賽裡,所有進入決賽的同學都會獲得一件很漂亮的t shirt。但是每當我們的工作人員把上百件的衣服從商店運回到賽場的時候,卻是非常累的!所以現在他們想要尋找最短的從商店到賽場的路線,你可以幫助他們嗎?input 輸入包括多組資料。每組資料第一行是兩個整數n m n 100,m 10000 n...

最短路 最短路徑問題

題目描述 平面上有n個點 n 100 每個點的座標均在 10000 10000之間。其中的一些點之間有連線。若有連線,則表示可從乙個點到達另乙個點,即兩點間有通路,通路的距離為兩點直線的距離。現在的任務是找出從一點到另一點之間的最短路徑。input 共有n m 3行,其中 第一行為乙個整數n。第2行...

Codeup最短路徑 最短路徑問題

給你n個點,m條無向邊,每條邊都有長度d和花費p,給你起點s終點t,要求輸出起點到終點的最短距離及其花費,如果最短距離有多條路線,則輸出花費最少的。輸入n,m,點的編號是1 n,然後是m行,每行4個數 a,b,d,p,表示a和b之間有一條邊,且其長度為d,花費為p。最後一行是兩個數 s,t 起點s,...