本章节回顾一下图论里经典的算法
DFS与BFS
DFS --stack–O(h)(根据树的高度)–不具最短路–恢复现场(恢复到之前的状态)–剪枝(可行性剪枝、最优性剪枝)
BFS --queue–O(2h)(宽度)–最短路
DFS:经典题目:排练数字、N-皇后
最短路径
难点在于建图
dijksra
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更新到其他点的距离
|
完整代码:
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)