1、图的深度优先遍历
基本思想:访问节点v0,然后访问v0邻接到的未被访问的顶点v1,再从v1出发,按照深度优先方式遍历,一直递归到所有顶点的邻接点都被访问,则递归结束。其意义是沿着图的某一分支进行遍历,知道末端然后回溯,沿着另一个分支进行同样遍历,知道所有分支都被遍历过结束。
2、图的宽度优先遍历
基本思想:先访问顶点v0,然后访问v0邻接到的所有未被访问的顶点,在一次访问这些顶点邻接到的所有未被访问的节点,直到所有节点都被访问。
#include
#include
#include
#include
using namespace std;
#define v 100
int head[v];
struct Edgenode
{
int to;
int w;
int next;
}edge[v];
bool s[v] = {0};
void dfs(int x)
{
s[x] = true;
printf("%d\n",x);
int i;
for(i = head[x]; i != -1; i = edge[i].next)
{
if(!s[edge[i].to])
dfs(edge[i].to);
}
}
void bfs(int x)
{
memset(s,0,sizeof(s));
int queue[v];
int iq = 1;
queue[iq++] = x;
int i,k;
for(i = 1; i < iq; i++)
{
//每次从队头取节点,一定是下一个带扩展节点
printf("%d\n",queue[i]);
//遍历当前节点相连的节点,如果没有被访问过则入队
for(k = head[queue[i]]; k != -1; k = edge[k].next)
{
if(!s[edge[k].to])
queue[iq++] = edge[k].to;
}
}
}
int main()
{
int i,j,w,m,n;
scanf("%d %d",&n,&m);//m:边的数目 ,n: 点的数目
int k = 1;
memset(head,-1,sizeof(head));
while(k <= m)
{
cin>>i>>j>>w;
edge[k].to = j;
edge[k].w = w;
//数组模拟链表的主要方式是记录下一个节点在数组的哪个位置
edge[k].next = head[i];
head[i] = k;//存储描述点i边信息的链的起点在edge数组中的位置。
k++;
//构造前向星是将信加入的节点放到对用链的最开始并修改head数组中对应的位置
}
cout<<"-------------dfs----------------"<