單源最短路演算法

2021-09-11 23:21:14 字數 1912 閱讀 4086

最短路徑:從某頂點出發,沿圖的邊到達另一頂點所經過的路徑中,各邊權值之和最小的一條路徑

單源最短路:在圖中,指定乙個點為源,求源到其它各點的最短路徑

1.dijkstra演算法  o(nlogn)流程

錄入圖的資訊並完成初始化

找到目前離源節點最近的點p

利用p的所有出邊優化源節點到p出邊鄰近節點的邊權值

圖除了源節點其餘n-1個結點都優化過,那麼進行5,否則進行2

輸出

#include#include#includeusing namespace std;

const int maxn=100;

const int maxm=10000;

int book[maxn],dis[maxn],head[maxn],cnt;

struct nodeside[maxm];

struct node

node(int id,int cost):id(id),cost(cost){}

friend bool operator < (node a,node b) };

void init()

void add(int x,int y,int d)

void dij(int sx,int ex)

} }printf("%d\n",dis[ex]);

}int main()

scanf("%d%d",&s,&e);

dij(s,e);

return 0;

}

一些應用:

1.求點s到其餘各點的最短距離之和

1.去掉if(now.id==ex) break;

2.dij(s);

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

ans+=dis[i];

2.求有向圖其餘各點到該點的距離之和

1.同上

2.倒著存圖 (原: add(x,y,z);現: add(y,x,z));

3.同上

2.spfa演算法

#include#include#includeusing namespace std;

const int maxn=100;

const int maxm=10000;

struct nodeside[maxm];

int head[maxn],dis[maxn],cont[maxn],book[maxn],cnt,n,m;

void init()

void add(int x,int y,int d)

void spfa(int sx,int ex)

q.push(y);}}

} }if(!flag)

printf("%d\n",dis[ex]); }

int main()

scanf("%d%d",&s,&e);

spfa(s,e);

return 0;

}

負環:全部由負權邊組成的環,這樣的話就不存在最短路,因為在負環中每轉一圈最短路長度總會變小

判負環的原理:在spfa演算法中,每個點最多鬆弛的次數為n-1,n為節點個數當乙個節點被鬆弛超過n次時,那麼說明圖中存在負環

利用spfa判正環

1.dis初始化 memset(dis,0,sizeof(dis);

2.鬆弛操作的「>」改為「<」;

單源最短路徑演算法

簡單介紹 最短路徑演算法是圖演算法中的經典演算法,是用於解決圖中某個頂點到另外乙個頂點所經過路徑的花銷最小 這裡的花銷可能是時間也可能指費用等 dijkstra是用於解決單源最短路徑的經典演算法。圖的儲存方式 鄰接矩陣 在鄰接矩陣中,要獲取某個結點的出度和入讀,是通過掃瞄結點所在臨界矩陣中的行列完成...

單源最短路 Dijkstra演算法

前提 沒有負邊 如果有負邊,可以用此方法檢查是否有負圈 const max v max v 表示邊的權重值 d max v 儲存從起點到每個點的總權重值 bool used max v 表示當前點是否已經訪問完畢 思想 找到乙個已經確定最短距離的點,更新跟它相鄰的點,之後這個點就不用關心了。起點最短...

單源最短路演算法 Dijkstra

dijkstra演算法是單源最短路演算法,可以求解不帶負權邊的圖中,從源點s到其它所有點的最短路。時間複雜度近似o n 2 可以用堆優化。一般用鄰接表,也可用鄰接矩陣。在稠密圖上會有較好的效能表現。include include using namespace std int s,t,n,m,las...