最短路演算法總結

2022-07-09 03:54:11 字數 2389 閱讀 9324

樸素版dijkstra(適用於 無負權變的稠密圖)

#include #include using namespace std;

const int n = 510;

int n, m;

int dis[n], g[n][n]; // dis陣列存放起點到各點之間的最短距離

bool st[n]; // st陣列判斷這個點是否已經加入了最短路徑的集合

int dijkstra(int start, int end)

//將找到的點加入集合

st[t] = true;

// 由這個點來更新起點到其他點的距離

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

}return dis[end];

}int main()

int ans = dijkstra(1, n);

if(ans == 0x3f3f3f3f) printf("-1");

else printf("%d", ans);

return 0;

}

bellman-ford演算法時間輔助度o(n*m) 幾乎不會使用,除了少數情況如這題,要求最多k條邊的最短路徑,適用於稀疏圖,可以處理負權邊,同時可以判斷是否存在負環,但是一般不用他來判斷負環,用佇列優化版的bellman-ford也就是spfa演算法來判斷負環。

#include #include using namespace std;

const int n = 10010, m = 510;

int dist[m], backup[m]; // backup 為dist的拷貝陣列

// 對建邊沒有條件,所以直接用乙個結構體陣列來儲存

struct edgeedges[n];

int n, m, k;

// 全名bellman_ford演算法,幾乎不用,除了這道題,因為k表示的最多經過k條邊的最短路徑當

int bf(int start, int end)

}return dist[end];

}int main();

}int ans = bf(1, n);

if(ans > 0x3f3f3f3f / 2) puts("impossible"); // 因為可能存在負權變所以正無窮的邊也可能被更新

else printf("%d", ans);

return 0;

}

佇列優化版bellman-ford也叫spfa,適用於稀疏圖,可處理負權邊以及判斷負環,時間複雜度o(m),但有一種將時間複雜度卡到o(n*m)的方法這時就有可能超時,但一般不會卡

#include #include #include using namespace std;

const int n = 100010;

int h[n], ne[n], e[n], w[n], idx;

int n, m;

int dis[n], st[n];

queueq;

// 鏈式前向星核心**

void add(int a, int b, int c)

void spfa(int start)}}

}}int main()

spfa(1);

if(dis[n] == 0x3f3f3f3f) puts("impossible");

else printf("%d", dis[n]);

return 0;

}

spfa判斷是否存在負環

#include #include #include using namespace std;

const int n = 100010;

int h[n], e[n], ne[n], idx, w[n], dis[n], cnt[n];

bool st[n];

int n, m;

queueq;

void add(int a, int b, int c)

// 當乙個點被入隊的次數大於能於n次則肯定存在負環,cnt陣列表示到達當前這個點最短路的邊數,

//如果cnt[x]>=n,說明至少經過了n條邊,即n+1個點,由抽屜原理可知顯然有兩個點重複,即存在負環

bool spfa()

while(q.size())}}

}return false;

}int main()

if(spfa()) puts("yes");

else puts("no");

return 0;

}

最短路演算法總結

1.floyd演算法 n 3複雜度 基本思想 開始設集合s的初始狀態為空,然後依次將0,1,n 1定點加入,同時用d i j 儲存從i到j,僅經過s中的定點的最短路徑,在初始時刻,d i j a i j 中間不經過任何節點,然後依次向s中插入節點,並進行如下更新 d k i j min 還可以使用乙...

最短路演算法總結

藉著usaco 3.26搞了幾天最短路。不得不說usaco真是菜鳥學習演算法的利器啊,有資料可以查錯。題上是乙個800 800的稀疏圖,需要求全源最短路 先用floyd試了一下。畢竟就三行,很好寫。時間o n3 裸交第九個點果然tle了,不過看題解有人水過了 就把邏輯語言改了一下,無向圖時間又可以優...

最短路演算法總結

dijkstra演算法 dijkstra 迪傑斯特拉 演算法是典型的單源最短路徑演算法,用於計算乙個節點到其他所有節點的最短路徑。最常見的問題就是 給你一張地圖,讓你求出指定的點到其餘各定點的最短路徑。演算法核心 每次找到離源點最近的乙個頂點,然後以該頂點為中心進行擴充套件,最終的到源點到其餘所有點...