常用的最短路演算法有三種(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...