图论(一):DFS,BFS,邻接链表,并查集

本文详细介绍了图的深度优先搜索(DFS)、广度优先搜索(BFS)的概念及其实现,探讨了邻接链表和邻接矩阵两种图的表示方法,并深入讲解了并查集的数据结构及其应用。通过实例展示了DFS、BFS的遍历过程,以及并查集在解决实际问题中的操作步骤。
摘要由CSDN通过智能技术生成

本文总结了图的深度优先搜索,图的广度优先搜索,邻接链表和邻接矩阵的实现,并查集的实现。

0),预备知识
       
基础词汇:有向图,无向图,带权有向图,带权无向图,有向图中<Vi, Vj>:即Vi--->Vj,弧尾--->弧头,无向图中相邻记为(Vi, Vj),顶点有穷集合V+边的有穷集合E。
        图的两种实现方式:1,邻接矩阵:edge[n][n]表示有n个结点,数组内容为权值大小或者是否存在边(∞表示无边,权值或1表示有边,0表示结点到结点本身);
                                2,邻接链表:针对稀疏矩阵较适宜,为图的每个顶点都建立一个单链表,第i个单链表中保存与结点Vi所有相邻结点信息(无向图)或弧尾结点信息(有向图),以及边信息。


1),图的深度优先搜索(DFS)
        深度优先算法的主要思想是:首先以一个未被访问过的顶点作为起始顶点,沿当前顶点的边走到未访问过的顶点;当没有未访问过的顶点时,则回到上一个顶点,继续试探访问别的顶点,直到所有的顶点都被访问过。显然,深度优先遍历是沿着图的某一条分支遍历直到末端,然后回溯,再沿着另一条进行同样的遍历。
        例1:以下图为例,从结点1开始DFS,程序的算法思想是:在主函数中初始化连接矩阵,调用dfs(1) ---> 设置变量cnt,将cnt等于结点个数作为dfs递归的临界条件 ---> 设置标志mark[n],当当前访问结点的边指向的下一结点未被访问时,进行dfs调度访问(结点的相邻结点的访问顺序为标号由小到大的顺序)


/***先输入n个结点,m条边,之后输入无向图的m条边,之后对上图输出DFS遍历的结点顺序***/
#include <iostream>
#include <iomanip>
#define nmax 110
#define inf 999999999
using namespace std;
int n, m, cnt, edge[nmax][nmax], mark[nmax];//结点数,边数,计数值,邻接矩阵,结点访问标记
void dfs(int cur){
	cnt++;
	/***operation***/
	if(cnt == 1)
		cout << cur;
	else 
		cout << setw(3) << cur;
	/***operation***/
	if(cnt == n) return;
	else{
		int i;
		for(i = 1; i <= n; i++){
			if(edge[cur][i] == 1 && mark[i] == 0){
				mark[i] = 1;
				dfs(i);
			}
		}
		return;
	}

}

int main(){
	while(cin >> n >> m && n != 0){
		//初始化邻接矩阵
		int i, j;
		for(i = 1; i <= n; i++){
			for(j = 1; j <= n; j++){
				edge[i][j] = inf;
			}
			edge[i][i] = 0;
		}
		int a, b;
		while(m--){
			cin >> a >> b;
			edge[a][b] = edge[b][a] = 1;
		}
		//以dnf(1)为起点开始递归遍历
		memset(mark, 0, sizeof(mark));
		cnt = 0;
		mark[1] = 1;
		dfs(1);
		cout << endl;
	}
	return 0;
}
        程序运行结果:

        例2:下面是城市的地图,注意是单向图,求城市1到城市5的最短距离
        程序思路:从1号城市出发,可到达2号城市和5号城市,若按照1到n的顺序则先访问2号城市;访问完2号城市后,由于2号城市可到达的城市有3号和5号城市,我们访问3号城市;此后,3号城市可到达1号,4号城市,由于1号城市已被访问过,我们访问4号城市;4号城市又可到达5号城市,我们最后访问5号城市。但是,1->2->3->4->5并不一定是最短路径,我们需要撤除5号城市的访问标记,返回到4号城市,由于经由4号城市已访问过5号城市而又没有其他城市可访问;再返回到3号城市,经由3号城市访问过4号城市,则看看能否访问5号城市,不能则再返回到2号城市,这时2号城市有路径直达5号城市,即1->2->5.....如此折回再前进,直至找到所有1号城市能到达5号城市的路径,取其中的最小值。


/***先输入n个结点,m条边,之后输入有向图的m条边,边的
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值