福州DAY8(图论专题)

福州Day8之图论专题

图的类型:
1.有向图:只可以从箭头的一段走到另一端,不可以往回走。

2.无向图:双向都可以走

计算机中的存储方式:
1.邻接矩阵(存储空间大,如果范围大,边稀疏,浪费就大)

2.邻接表:无权图:设置结点指针;有权图:结点,邻接点指针;邻接点,边权值,下一个邻接点指针。

有向无环图

不构成环形(即没有一条路径会回到起始点使其构成环形)。

拓扑排序

对于任意两个节点,例如A可以到B,那么A一定得在B前面(即B不能再A前面)。

  入度:所有指向该点的其它节点的边数的数量。

  出度:该点所有指向其它节点的边的数量。

当入度为0时,则对其他点没有影响,可以排在最前端,删除节点后只要把改点所有出度对应的点的入度都减去即可。

Ps:vector<数据类型>变量名;(会使程序编写更加容易。)

最小生成树

  在一个带权的无向图里寻找边权最小和的路线(必须包括这个图里每一个点,非每一条边)。

1.基于边的算法(krudkal算法)

  便利所有的遍历,会加上(n-1)条边,每次加入一边权最小的边并要判断加入边后是否形成环。判断两点是否连通,如果已连通,加入边则成环。否则,不形成环。

2.基于点的算法(prim算法)

  先分成两个集合,每一次找到一条最小的边,加入对应的点。

【例题】

  判断最小生成数是不是唯一。

  分析:先跑出最小生成树(两种方法),每次加上一条边构成环,再减去环中的一条最长的边,判断减去这条边之后是否与最小生成树的权值一样。如果一样,则方案不是唯一。再用树上dp实现:每次跑该节点的邻接点,寻找值最大的。

最短路

1.dijkstra(迪杰斯特拉算法)

  与prim算法基本一样,但是要更新相邻的dist值。(dist对应的是原点到该点的最

短路,基于点的算法。)

 2.spfa算法(对Bellman-ford算法的迭代的改进)

  跟dijkstra相像。动态更新dist值的过程。

(以上都是单源最短路。)

3.floyed(弗洛伊德算法)

dp[i][j]=min(dp[i][j],dp[i][k]+dp[k][j]);

三重循环枚举I,j,k。

【例题】

求S到T地的最短路径或比路径长1单位距离的路径,和满足条件的路径条数。

分析:在spfa上进行改进。

分类讨论当前的dist值。如果等于最短路,条数增加,如果小于次短路,新值等于最短路,当前值改成次段路(次短路更新);等于次短路,条数增加。其余同于spfa。最终答案为最短路路径条数加上次短路路径条数。

猜你喜欢

转载自blog.csdn.net/qq_40681184/article/details/79319253
今日推荐