本文出自:http://blog.csdn.net/svitter
一.图的生成树
.必然含有n-1条边。
.无向带权图。
.如何求最小生成树。
.prime | kruskal
Prime: 从点里面找一个最短的边。
kruskal: 从边里面找。
.密集图使用邻接矩阵来存储。
.稀疏图用邻接表来存储。
.开一个邻接表,一个vector的一维数组。
时间复杂度(ElogV)
一般情况下邻接表更加优秀
题目:poj1258(邻接矩阵)
使用prime+堆完成。priority_queue(就是二叉堆)(当初不做错,也不知道)
.kruskal算法
.构造过程
选权值最小的边,利用并查集,判断是否有回路
构造边的集合。
排序的函数:规定权值小的放在前面.
sort();
题目:POJ2349 Arctic_Network
.次小生成树
.给定的图最小生成树是否唯一。
.求出次小生成树,是否权值于最小生成树
.最小生成树的邻集里包含次小生成树。
.如何从一个最小生成树生成一个次小生成树?
.T0是一颗次小生成树,T(n-1)一定是次小生成树且跟t一条边。
.最优生成树
二.最短路径
.一次求所有的最短路径
.单元最短路 Dijkstra‘s有向无向图。
*没有负权
.贪心思想。p是最短路已经求出的点。离S最近的点
.一开始就是空
.dijkstra不适用于无向图
例题:POJ3159 Candies
*Bellman-Ford算法
也是求单元最短路,可以处理有向图负权边。
不能处理带。负环。负值回路。(负无穷)
构建一个最短路径长度序组.
dist[]为滚动数组
POJ3259
*Floyd_alogrithm
用二维数组存边
*SPFA算法
SPFA算法利用队列来动态更新最小值。
*Floyd_alogrithm
O(n^3)时间复杂度。
三.强连通分支
Korasaju算法
"忽略
强连通分支:
最大连通子图。任意顶点互相可达,则是强连通的。
极大强连通子图就是强连通分支。
有向图出度为0,在任何点都可以出发可达。
无环 “有向无环图”
POJ2186
求出所有的连通分量。
有向无环图DAG/无向无环图:树;
POJ1236
加边变成强连通图。
有向图强连通分支 Taijan算法
有向图利用深度优先搜索就是搜索树。dfn值。