首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

有向图深度和广度优先遍历有关问题(基本概念,别笑小弟我)

2012-10-14 
有向图深度和广度优先遍历问题(基本概念,别笑我)举个最简单的有向图b - a - c设a是第一个顶点,这样的有

有向图深度和广度优先遍历问题(基本概念,别笑我)
举个最简单的有向图

b -> a -> c

设a是第一个顶点,这样的有向图从a只能走到c,不可能走到b,那么从a进行遍历,b是否应该遍历到?

我开始一直不太明白严蔚敏书上深度广度优先遍历最外层的那个循环是干吗的,现在明白加上外层的循环就可以处理这种从第一顶点无法到达的顶点,但这样就很奇怪,路径是断的,b相当于凭空冒出来

以下是根据严蔚敏书上逻辑写的代码

C/C++ code
#include <stdio.h>#include <stdint.h>#include <stack>#include <queue>using namespace std;#define MAX_NODE 26typedef int InfoType;typedef int ElemType;typedef int VRType;typedef char VertexType;typedef enum{    DG = 0,    DN,    UDG,    UDN}GraphKind;typedef struct ArcCell{    VRType adj;    InfoType *info;}ArcCell, AdjMatrix[MAX_NODE][MAX_NODE];typedef struct{    VertexType vexs[MAX_NODE];    AdjMatrix arcs;    int vexnum;    int arcnum;    GraphKind kind;}MGraph;void BuildUDG(MGraph *G){    int i = 0, j = 0, k = 0;    char c = 'a';    int n1[] = {0, 0, 1, 1, 2, 2, 3, 4, 5};    int n2[] = {1, 2, 3 ,4, 5, 6, 7, 7, 6};    if (!G)        return;    G->vexnum = 8;    G->arcnum = 9;    G->kind = UDG;    for (i=0; i<G->vexnum; ++i)        G->vexs[i] = c++;    for (i=0; i<G->vexnum; ++i)    {        for (j=0; j<G->vexnum; ++j)        {            G->arcs[i][j].adj = 0;            G->arcs[i][j].info = NULL;        }    }    for (k=0; k<G->arcnum; ++k)    {        G->arcs[n1[k]][n2[k]].adj = 1;        G->arcs[n2[k]][n1[k]].adj = G->arcs[n1[k]][n2[k]].adj;    }}static unsigned char visited[MAX_NODE] = {0};int NextAdjVex(MGraph *G, int v, int w){    int i = 0;    if (!G || v < 0)        return -1;    for (i=++w; i<G->vexnum; ++i)        if (G->arcs[v][i].adj != 0 && G->arcs[v][i].adj != INT32_MAX)            return i;    return -1;}void DFS(MGraph *G, int v){    int i = 0;    if (!G)        return;    visited[v] = 1;    printf("%c ", G->vexs[v]);    for (i=NextAdjVex(G, v, -1); i>=0; i=NextAdjVex(G, v, i))    {        if (!visited[i])            DFS(G, i);    }}void DFSRecursion(MGraph *G){    int i = 0;    if (!G)        return;    for (i=0; i<G->vexnum; ++i)        visited[i] = 0;    for (i=0; i<G->vexnum; ++i)    {        if (!visited[i])            DFS(G, i);    }    printf("\n");}void DFSStack(MGraph *G){    int i = 0, j = 0, k = 0;    stack<int> s;    if (!G)        return;    for (i=0; i<G->vexnum; ++i)        visited[i] = 0;    for (i=0; i<G->vexnum; ++i)    {        if (!visited[i])        {            visited[i] = 1;            printf("%c ", G->vexs[i]);            s.push(i);            while (!s.empty())            {                j = s.top();                s.pop();                for (k=NextAdjVex(G, j, -1); k>=0; k=NextAdjVex(G, j, k))                {                    if (!visited[k])                    {                        visited[k] = 1;                        printf("%c ", G->vexs[k]);                        s.push(k);                        j = k;                    }                }            }        }    }    printf("\n");}void BFSQueue(MGraph *G){    int i = 0, j = 0, k = 0;    queue<int> s;    if (!G)        return;    for (i=0; i<G->vexnum; ++i)        visited[i] = 0;    for (i=0; i<G->vexnum; ++i)    {        if (!visited[i])        {            visited[i] = 1;            printf("%c ", G->vexs[i]);            s.push(i);            while (!s.empty())            {                j = s.front();                s.pop();                for (k=NextAdjVex(G, j, -1); k>=0; k=NextAdjVex(G, j, k))                {                    if (!visited[k])                    {                        visited[k] = 1;                        printf("%c ", G->vexs[k]);                        s.push(k);                    }                }            }        }    }    printf("\n");}int main(){    MGraph G = {0};    BuildUDG(&G);    DFSRecursion(&G);    DFSStack(&G);    BFSQueue(&G);    getchar();} 



[解决办法]
从a出发当然不可能走到b,也不可能遍历到b,这不是很明显的么?
[解决办法]
G->arcs[n1[k]][n2[k]].adj = 1;
G->arcs[n2[k]][n1[k]].adj = G->arcs[n1[k]][n2[k]].adj;这个不是无向图吗?

热点排行