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