最短路演算法

2021-06-22 13:30:33 字數 2447 閱讀 3909

常用的最短路演算法有三種(disjkstra,floyd,ballman-floyd)

一、disjkstra演算法

dijkstra演算法要求圖上的權非負數。同樣使用於無向圖;

[html]view plain

copy

#include

<

stdio.h

>

//hdu 2544  

#define maxsum 0x7fffffff   //重點  

int map[101][101],dist[101],s[101];    

void dijkstra(int x,int n)  //x為起點,n為頂點個數    

s[x]=1;   //s進入集合中  

for(int i=1

;i<

=n;i++)    

s[u]=1;   //表明該路頂點進入集合s  

for(int j=1

;j<

=n;j++)    

if(s[j]==0)   //未進入s集合的點  

if(dist[u]+map[u][j]<

dist

[j]&&map[u][j]

<

maxsum

) 對比直接到達的路和間接到達的路  權map[u][j]必須實際存在  

dist[j]=dist[u]+map[u][j];   //  

}    

}    

int main()    

for(i=0

;i<

n;i++)    

scanf("%d%d",&s,&e);s為起始點,e為終止點  

dijkstra(s,n);   //需遍歷所有頂點  

printf("%d\n",dist[e]);    

}    

return 0;    

}  

二、floyd演算法

可以處理負權邊,但無法處理負環,效率低,空間開銷大,對於密集點圖較為實用

本質是動態規劃,要求圖上沒有負環,否則會導致死迴圈,可用於無向圖,此時乙個無向邊相當於兩個有向邊

[html]view plain

copy

#include

<

stdio.h

>

//hdu 1874  

#define max 99999999   //切忌max不能定義為0xfffffff,下面有兩個map相加  

int main()    

for(i=0

;i<

n;i++)    

scanf("%d%d",&x,&y);    

for(k=0

;k<

m;k++)   //k為「中轉站」  

if(map[x][y]<

max) printf("%d\n",map[x][y]);    

else printf("-1\n");    

}    

return 0;    

}  

三、bellman-floyd演算法

可以是負權值,可以判斷是否為負環(非常好用)

[html]view plain

copy

include 

<

iostream

>

using namespace std;  

const int maxnum

= 100

;  const int maxint

= 99999

;  // 邊,  

typedef struct edgeedge;  

edge edge[maxnum];     // 儲存邊的值  

int  dist[maxnum];     // 結點到源點最小距離  

int nodenum, edgenum, source;    // 結點數,邊數,源點  

// 初始化圖  

void init()  

}  // 鬆弛計算  

void relax(int u, int v, int weight)  

bool bellman_ford()  

if(finish)  

break;  

}  bool flag= 1

;  // 判斷是否有負環路  

for(int i=1

; i<

=edgenum; ++i)  

if(dist[edge[i].v] >

dist[edge[i].u] + edge[i].weight)  

return flag;  

}  int main()  

最短路徑演算法 最短路

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

最短路演算法

最短路演算法有很多,具體哪個好,和資料是有很大關係的 從起點開始向外擴充套件,最壞o v e 實際體驗比o e log v 的dijkstra可能快 include include define max e 4002 define max v 1002 define inf 0x3f3f3f usi...

最短路演算法

參考 一 dijkstar 迪傑斯特拉 演算法 簡介 此演算法按路徑長度 next點 遞增順序產生最短路。步驟 1.先將點集v分成兩組 s 已求出最短路徑的集合 t v s 尚未確定最短路徑的集合 2.初始化 使s t t中頂點對應的距離值,若存在,則為弧上的權值,如不存在則為inf 無窮 3.從t...