#include <stdio.h>
#define MaxVex 100
#define INFINITY 65535
typedef char VertexType;
typedef int EdgeType;
int visited[MaxVex];
typedef struct {
VertexType vexs[MaxVex];
EdgeType arc[MaxVex][MaxVex];
int numVertexes, numEdges;
}MGraph;
typedef struct {
int data[MaxVex];
int front, rear;
}Queue;
void InitQueue(Queue *Q)
{
Q->front = Q->rear = 0;
}
void EnQueue(Queue *Q, int e)
{
if ((Q->rear+1)%MaxVex == Q->front)
return ;
Q->data[Q->rear] = e;
Q->rear = (Q->rear+1)%MaxVex;
}
int QueueEmpty(Queue *Q)
{
if (Q->front == Q->rear)
return 1;
else
return 0;
}
void DeQueue(Queue *Q, int *e)
{
if (Q->front == Q->rear)
return ;
*e = Q->data[Q->front];
Q->front = (Q->front+1)%MaxVex;
}
void CreateMGraph(MGraph *G)
{
int i, j, k, w;
printf("****************************\n");
printf("输入结点数和边数: (使用空格隔开)");
scanf("%d%d", &G->numVertexes,&G->numEdges);
fflush(stdin);
printf("****************************\n");
printf("输入各个顶点:\n");
for (i=0; i<G->numVertexes; ++i)
{
printf("顶点%d: ",i+1);
scanf("%c", &G->vexs[i]);
fflush(stdin);
}
for (i=0; i<G->numVertexes; ++i)
{
for (j=0; j<G->numVertexes; ++j)
G->arc[i][j] = INFINITY;
}
for (k=0; k<G->numEdges; ++k)
{
printf("输入边(vi, vj)中的下标i和j和权W: ");
scanf("%d%d%d", &i,&j,&w);
G->arc[i][j] = w;
G->arc[j][i] = G->arc[i][j];
}
}
void DisMGraph(MGraph *G)
{
int i, j, k;
k = G->numVertexes;
for (i=0; i<k; ++i)
{
for (j=0; j<k; ++j)
{
printf("%5d ", G->arc[i][j]);
}
putchar('\n');
}
}
void DFS(MGraph G, int i)
{
int j;
visited[i] = 1;
printf("%c ", G.vexs[i]);
for (j=0; j<G.numVertexes; ++j)
{
if (G.arc[i][j]!=INFINITY && !visited[j])
DFS(G, j);
}
}
void DFSTraverse(MGraph G)
{
int i;
for (i=0; i<G.numVertexes; ++i)
visited[i] = 0;
for (i=0; i<G.numVertexes; ++i)
{
if (!visited[i])
DFS(G, i);
}
}
//图的广度优先遍历
void BFSTraverse(MGraph *G)
{
int i, j;
Queue Q;
for (i=0; i<G->numVertexes; ++i)
visited[i] = 0;
InitQueue(&Q);
for (i=0; i<G->numVertexes; ++i)
{
if (!visited[i])
{
visited[i] = 1;
printf("%c ", G->vexs[i]);
EnQueue(&Q, i);
while (!QueueEmpty(&Q))
{
DeQueue(&Q, &i);
for (j=0; j<G->numVertexes; ++j)
{
if (!visited[j] && G->arc[i][j]!=INFINITY)
{
visited[j] = 1;
printf("%c ", G->vexs[j]);
EnQueue(&Q, j);
}
}
}
}
}
}
int main(){
MGraph G;
CreateMGraph(&G);
printf("\n欢迎使用\n");
printf("\n图的深度优先遍历为: ");
DFSTraverse(G);
printf("\n图的广度优先遍历为: ");
BFSTraverse(&G);
printf("\n");
return 0;
}
2018-06-10图的遍历与应用
最后编辑于 :
©著作权归作者所有,转载或内容合作请联系作者
- 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
- 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
- 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
推荐阅读更多精彩内容
- 【蝴蝶效应】 蝴蝶效应:上个世纪70年代,美国一个名叫洛伦兹的气象学家在解释空气系统理论时说,亚马逊雨林一只蝴蝶...