预计阅读时间:10分钟
图也是一种非线性的数据结构,它在表示城市交通、多节点网络等关系时非常好用,图的基本示意图如图1所示。
一、图的存储
图中个节点的关系的二维数组表示如图2所示。
二、图的遍历
根据访问顶点的规律,图的遍历分两种,分别是深度优先搜索和广度优先搜索。
深度优先搜索
深度优先搜索的基本思想是:从顶点v0出发,访问v0,然后选择一个与v0相邻切未被访问过的顶点v1进行访问,再从v1出发选择一个与v1相邻且未被访问过的顶点v4进行访问,以此类推,直到图中所有顶点都被访问到为止。如果当前被访问过的顶点的所有邻接顶点都已经被访问过了,则退回到已访问顶点序列中最后一个拥有未被访问的临接顶点的顶点,从该顶点出发按照同样的方法继续搜索,如图3所示。
访问顺序为:v0->v1->v4->v3->v2。
深度优先搜索要用到栈,对于有路径的相邻节点一次入栈,当图中无节点可以访问时,将栈中节点出栈,搜索过程如图4所示。
代码实现
const int maxn=10;
int a[maxn][maxn];
int stk[maxn],h[maxn];
int n,top=0,k=0;
h[1]=1;
stk[0]=1;
while(top>=0)
{
k++;
if(k>n)
{
k=stk[top--];
}
else if(!h[k]&&a[stk[top][k]])
{
cout<<'-'<<k<<;
h[k]=1;
stk[++top]=k;
k=0;
}
}
广度优先搜索
广度优先搜索的基本思想是:访问初始点v0,并将其标记为已访问,接着访问与v0相邻的所有未被访问过的顶点v1和v2,并标记已访问,然后按找v1,v2的顺序访问每一个顶点的所有未被访问过的邻接点,并把它们也标记成已访问,以此类推。
访问顺序:v0->v1->v2->v4->v3。
广度优先搜索要用到队列,对于访问节点的所有路径的相邻节点依次入队,然后从队头取出一个元素进行访问。访问节点的所有路径的相邻节点依次入队,直到访问完整个图。
代码实现
const int maxn=10;
int a[maxn][maxn],q[maxn],h[maxn];
int n;
q[1]=1;h[1]=1;
for(int f=1,r=1; f<=r; f++)
{
int u=q[f];
for(int i=1; i<=n; i++)
{
cout<<'-'<<i;
q[++r]=i;
h[i]=1;
}
}
好啦,以上就是本章的全部内容了,希望大家有所收获!
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。