实验12是有关图论的内容。
创建无向图类,存储结构使用邻接链表,提供操作:插入一条边,删除一条边,BFS,DFS。
- 第一行输出图中有多少个连通分量
- 第二行输出所有连通子图中最小点的编号(升序),编号间用空格分隔
- 第三行输出从s点开始的dfs序列长度
- 第四行输出从s点开始的字典序最小的dfs序列
- 第五行输出从t点开始的bfs序列的长度
- 第六行输出从t点开始字典序最小的bfs序列
- 第七行输出从s点到t点的最短路径,若是不存在路径则输出-1
最主要的一点,在进行所有操作之前,应当调整一下邻接链表。让每一个链表里面的结点元素都是从小到大排序的,这样极大的方便了后续操作,比如一遍dfs,输出的肯定就是字典序最小的dfs序列。
对连通子图的操作应该用dfs,这一点考虑不周,用dfs就很简单,一次dfs就是一个连通子图,所以很容易输出有多少连通分量,之后
for (int i = 1; i <= n; ++i)
if (!reach[i])
reach2[res++] = i, dfs(i);
这样就能找到所有连通子图中最小点的编号(升序),非常巧妙。
再说一下第七步,这个方法其实我想到了,但是忘记用了。。
核心思想就是reach1[u->element] = reach1[w] + 1;
其中w就是连接u的父顶点。这样能够很好的储存长度。