图类基础操作

实验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的父顶点。这样能够很好的储存长度。

发布了24 篇原创文章 · 获赞 1 · 访问量 1657

猜你喜欢

转载自blog.csdn.net/lllsy_12138/article/details/103519082