深度优先搜索:首先从一个未走过的顶点作为起始顶点,沿着当前顶点的边到未访问过的顶点;当没有未访问过的顶点时,则返回到上一顶点,继续试探访问别的顶点,直到所有顶点都被访问过。
代码实现:
#include "stdio.h"
int book[101],sum=0,n,e[101][101]; //e[][] 邻接矩阵
void dfs(int cur) //cur是当前所在的顶点编号
{
int i;
printf("%d ",cur);
sum++; //访问节点计数器
if(sum == n) return; //所有顶点都已经访问过则直接退出
for(i=1;i <= n;i++) //从1号顶点到n号顶点依次尝试,看哪些结点与当前节点cur有边想连
{
//判断当前顶点cur到顶点i是否有边,并判断顶点i是否访问过
if(e[cur][i] == 1 && book[i] == 0)
{
book[i] = 1; //标记顶点i已经访问过
dfs(i); //从顶点i再出发
}
}
return;
}
int main()
{
int i,j,m,a,b;
scanf("%d %d",&n,&m);
//初始化二维矩阵
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
{
if(i == j) e[i][j] == 0;
else e[i][j] = 99999999; //假设为正无穷
}
}
//读顶点之间的边
for(i=1;i<=m;i++)
{
scanf("%d %d",&a,&b);
e[a][b] = 1;
e[b][a] = 1; //
}
//从1号顶点出发
book[1] = 1;
dfs(1); //从1号开始
getchar();getchar();
return 0;
}
效果图:
笔记:
1.邻接矩阵
邻接矩阵表示法:设图A=(V,E)有 n 个顶点,则
图的邻接矩阵是一个二维数组A.arcs[n][n],定义为:
无向图的邻接矩阵表示法:
分析1:无向图的邻接矩阵是对称的
分析2:顶点 i 的度=第 i 行(列)中 1 的个数
特别:完全图的邻接矩阵中,对角元素为0,其余为1