n點 m邊
1.spfa演算法最壞情況o(nm)一般情況下是線性的複雜度,當出現網格狀的資料時容易出現最壞情況,一般不會被卡,邊權可以是負數,但是不能有負環。最常用的演算法因此寫在第乙個。
演算法思想:該演算法又叫做佇列優化的bellman-ford演算法,再bellman-ford演算法將變小的儲存在佇列中(也就是會對距離產生變化的點)
#include
#include
#include
#include
using
namespace std;
int n,m;
const
int n=
1e5+10;
vectorint,
int>>g[n]
;int d[n]
;bool in_que[n]
;void
spfa()
}}if(d[n]
>
0x3f3f3f3f/2
)cout<<
"impossible"
;else cout
);}spfa()
;return0;
}
2.dijkstra演算法o(n*n)
#include
#include
using
namespace std;
int n,m;
const
int n=
510;
int g[n]
[n];
int d[n]
;bool v[n]
;void
dijkstra()
}if(d[n]
>=
0x3f3f3f3f
)cout<<-1
;else cout
dijkstra()
;return0;
}
3.堆優化的dijkstra o(m*log(n))
#include
#include
#include
#include
using
namespace std;
int n, m;
const
int n =
1.5e5+10
;vectorint,
int>>g[n]
;int d[n]
;bool v[n]
;void
dijkstra()
);while
(q.size()
));}
}}if(d[n]
>=
0x3f3f3f3f
)cout<<-1
;else cout << d[n];}
intmain()
);}dijkstra()
;return0;
}
最小生成樹
1.prim (樸素版)o(n*n)
該演算法跟dijkstra()演算法特別像,不同點在於prim演算法d陣列(dist)維護的是到最小生成樹的距離,prim演算法可以進行堆優化,不過一般不常用,再稀疏圖是kruskal演算法更常用。
#include
#include
using
namespace std;
int n,m;
const
int n=
510;
int d[n]
;int g[n]
[n];
bool tg[n]
;void
prim()
}int res=0;
for(
int i=
1;i<=n;i++
)res+
=d[i];if
(res>
0x3f3f3f3f/2
)cout<<
"impossible"
;else cout<}int
main()
prim()
;return0;
}
2.kruskal演算法 o(m*log(m))
演算法的時間複雜度主要取決於排序的時間複雜度。演算法的基本思想,將所有邊小到大進行排序,遍歷所有邊,看看是否連通,如果不連通加入。
#include
#include
using
namespace std;
int n,m;
const
int m=
2e5+10;
const
int n=
1e5+10;
struct edgeedges[m]
;int p[n]
;int
find
(int a)
void
merge
(int a,
int b)
bool
judge
(int a,
int b)
bool
cmp(edge a,edge b)
void
kruskal()
if(cnt==n-
1)cout
"impossible";}
intmain()
;}for(
int i=
1;i<=n;i++
)p[i]
=i;kruskal()
;return0;
}
最短路徑,最短路徑樹和最小生成樹
首先介紹這三個概念,很多人都聽過最短路徑了,但是最短路徑樹卻很少聽過,關於最短路徑樹的介紹也不太多。而最短路徑樹和最小生成樹更是完全不同的兩個概念。最短路徑就是從乙個指定的頂點出發,計算從該頂點出發到其他所有頂點的最短路徑。通常用dijkstra演算法,floyd演算法求解。最短路徑樹spt sho...
最小生成樹和最短路徑
這篇算作是 演算法 第四版部分讀後感吧 我思考這個問題的開始就是糾結最小生成樹prim演算法和最短路徑dijkstra演算法的異同 1.最小生成樹prim演算法 直接從例子開始吧,我們考慮一副這樣的圖 1.將d設為起始點 設定某個點為起始點是隨機的 考慮與它相鄰節點的權重值,圖中黃色節點,也就是d ...
最短路徑 最小生成樹
題目描述 n個城市,標號從0到n 1,m條道路,第k條道路 k從0開始 的長度為2 k,求編號為0的城市到其他城市的最短距離 輸入描述 第一行兩個正整數n 2 n 100 m m 500 表示有n個城市,m條道路 接下來m行兩個整數,表示相連的兩個城市的編號 輸出描述 n 1行,表示0號城市到其他城...