avatar

目录
图论经典问题

本章节回顾一下图论里经典的算法

DFS与BFS

DFS --stack–O(h)(根据树的高度)–不具最短路–恢复现场(恢复到之前的状态)–剪枝(可行性剪枝、最优性剪枝)
BFS --queue–O(2h2^{h})(宽度)–最短路

DFS:经典题目:排练数字、N-皇后

最短路径

难点在于建图

dijksra

c++
1
2
3
4
5
1. dist[1]=0,dist[other]=0x3f3f3f,S(目前已确定点的集合)
2. for i in n
$t leftarrow S中不存在,距离S最近的点$
$S \leftarrow S \bigcup t$
用t更新到其他点的距离

完整代码:

c++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
#include<iostream>
#include<cstring>
#include <algorithm>
using namespace std;
const int N=510;
int m,n;
int dist[N];
int g[N][N];
bool st[N];
int dijkstra(){
memset(dist,0x3f,sizeof(dist));
dist[1]=0;
for(int i=0;i<n-1;i++){
int t=-1;
for(int j=1;j<=n;j++){
if(!st[j]&&(t==-1||dist[j]<dist[t])
t=j;
}
for(int j =1;j<=n;j++){
dist[j]=min(dist[j],dist[t]+g[t][j]);
}
st[t]=true;
}
if (dist[n] == 0x3f3f3f3f) return -1;
return dist[n];
}
int main(){
memset(g,0x3f,sizeof(g));
scanf("%d%d",&n,&m);
while(m--){
int a,b,c;
scanf("%d%d%d",&a,&b,&c);
if(a==b)continue;
else
g[a][b]=min(g[a][b],c);
}
print("%d\n",dijkstra();
return 0;
}

最小生成树

哈密顿图

设G=<V,E>为一图(无向的或有向的).G中经过每个顶点一次且仅一次的通路称作哈密顿通路;G中经过每 个顶点一次且仅一次的回路称作哈密顿回路;若G中存在哈密顿回路,则称G为哈密顿图。

任何一个哈密顿图可以看作是一个基本回路再加上连接回路上顶点对的其他若干边
从一个基本回路上删除k个顶点,最多形成k个连通分支
向一个图种

斯坦纳树(steiner tree)

文章作者: Sunxin
文章链接: https://sunxin18.github.io/2020/06/17/gragh-th/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 lalala
打赏
  • 微信
    微信
  • 支付宝
    支付宝

评论