深度优先遍历是连通图的一种遍历策略。其基本思想如下:
设x是当前被访问顶点,在对x做过访问标记后,选择一条从x出发的未检测过的边(x,y)。若发现顶点y已访问过,则重新选择另一条从x出发的未检测过的边,否则沿边(x,y)到达未曾访问过的y,对y访问并将其标记为已访问过;然后从y开始搜索,直到搜索完从y出发的所有路径,即访问完所有从y出发可达的顶点之后,才回溯到顶点x,并且再选择一条从x出发的未检测过的边。上述过程直至从x出发的所有边都已检测过为止。
广度优先遍历是连通图的一种遍历策略。其基本思想如下:
1、从图中某个顶点V0出发,并访问此顶点;
2、从V0出发,访问V0的各个未曾访问的邻接点W1,W2,…,Wk;然后,依次从W1,W2,…,Wk出发访问各自未被访问的邻接点;
3、重复步骤2,直到全部顶点都被访问为止。
#include<stdio.h>
#define VERTEXNUM 100
int alskim[VERTEXNUM];
int alnum;
int Queue[VERTEXNUM];
int front, rear;
typedef struct node {
int numvector;//顶点数
int numedge; //边数
int vector[VERTEXNUM]; //顶点记录
int edge[VERTEXNUM][VERTEXNUM];//邻接矩阵
} Graph, *Graphp; //邻接矩阵表示图
void createGraph(Graphp Graphcase, int start, int end);
void init_Graph(Graphp Graphcase);
void print_edge(Graphp Graphcase);
void DFSGraph(Graphp Graphcase, int vector);
int checkrepeat(int alskim[VERTEXNUM], int alnum, int vi);
void BFSGraph(Graphp Graphcase, int vector);
int main()
{
Graph Graphcase;
int i, j;
printf("please input the num of the vector\n");
scanf("%d", &Graphcase.numvector);
printf("please input the num of the edge\n");
scanf("%d", &Graphcase.numedge);
printf("please input the edge\n");
for(i = 0; i < Graphcase.numedge; i++)
for(j = 0; j < Graphcase.numedge; j++)
Graphcase.edge[i][j] = 0;
init_Graph(&Graphcase);
// print_edge(&Graphcase);
printf("please input the begining\n");
scanf("%d", &i);
printf("\nBFSGraph is");
alskim[alnum++] = i;
BFSGraph(&Graphcase, i);
for(j = 0; j < alnum; j++)
printf("%d", alskim[j]);
printf("\n");
alnum = 0;
printf("\nDFSGraph is");
alskim[alnum++] = i;
DFSGraph(&Graphcase, i);
for(j = 0; j < alnum; j++)
printf("%d ", alskim[j]);
printf("\n");
return 0;
}
void createGraph(Graphp Graphcase, int start, int end)
{
Graphcase->edge[start][end] = 1;
Graphcase->edge[end][start] = 1;
}
void init_Graph(Graphp Graphcase)
{
int i;
int vector1, vector2;
for(i = 0; i < Graphcase->numedge; i++) {
scanf("%d%d", &vector1, &vector2);
createGraph(Graphcase, vector1, vector2);
}
}
void print_edge(Graphp Graphcase)
{
int i, j;
for(i = 0; i < Graphcase->numvector; i++) {
for(j = 0; j < Graphcase->numvector; j++)
printf("%d ", Graphcase->edge[i][j]);
printf("\n");
}
}
void DFSGraph(Graphp Graphcase, int vector)//图的深度优先遍历
{
int i;
for(i = 0; i < Graphcase->numvector; i++) {
if((Graphcase->edge[i][vector] == 1) && (checkrepeat(alskim, alnum, i) > 0)) {
alskim[alnum++] = i;
DFSGraph(Graphcase, i);
}
}
}
int checkrepeat(int alskim[VERTEXNUM], int alnum, int vi)//查看是否已经遍历过
{
int j;
for(j = 0; j< alnum; j++) {
if(alskim[j] == vi)
return -1;
}
return 1;
}
void BFSGraph(Graphp Graphcase, int vector) //广度优先遍历图
{
int i, j;
int vector1;
for(i = 0; i < Graphcase->numvector; i++)
if((Graphcase->edge[i][vector] == 1) && (checkrepeat(alskim, alnum, i) > 0)) {
alskim[alnum++] = i;
Queue[front++] = i;
}
while(rear != front) {
vector1 = Queue[rear++];
for(i = 0; i < Graphcase->numvector; i++)
if((Graphcase->edge[i][vector1] == 1) && (checkrepeat(alskim, alnum, i) > 0)) {
alskim[alnum++] = i;
Queue[front++] = i;
}
}
}