그림 의 깊이 우선 이동 (DFS)

그림 의 깊이 는 트 리 의 우선 순위 와 유사 합 니 다. 다른 점 은 중복 방문 을 피하 기 위해 전역 배열 로 노드 가 방문 한 정 보 를 저장 하 는 것 입 니 다. 인접 표 에 있어 인접 점 을 찾 는 데 필요 한 시간 은 정점 개수 와 변 의 개수 에 달 려 있 기 때문에 시간 복잡 도 는 o (n + e) 입 니 다. 그림 의 깊이 를 우선 옮 겨 다 니 는 과정 에서 옮 겨 다 니 는 변 을 보존 하면나머지 를 지우 면 나무 가 된다.

#define MaxSize 5
#define INF 100

//   
typedef struct ArcNode{
     
    int adjvex;
    struct ArcNode* nextArc;
}ArcNode;

typedef struct{
     
    char data;
    ArcNode* firstArc;
}VNode;

typedef struct{
     
    VNode adjList[MaxSize];
    int n;
    int e;
}AGraph;

int visit[MaxSize];

void initAGraph(AGraph* &G){
     
    G->e = 2;
    G->n = 3;
    cout<<"data:"<<endl;
    for (int i = 0; i < G->n; i++) {
     
        cin>>G->adjList[i].data;
        G->adjList[i].firstArc = NULL;
    }
    cout<<"vi,vj"<<endl;
    for (int j = 0; j < G->e; j++) {
     
        int vi,vj;
        cin>>vi>>vj;
        ArcNode* node = new ArcNode();
        node->adjvex = vj;
        node->nextArc = G->adjList[vi].firstArc;
        G->adjList[vi].firstArc = node;
    }
}

void DFS(AGraph *G,int v){
     
    ArcNode *p;
    visit[v] = 1;
    cout<<"current:"<<G->adjList[v].data<<endl;
    p = G->adjList[v].firstArc;
    while (p != NULL) {
     
        if (visit[p->adjvex] == 0) {
     
            DFS(G, p->adjvex);
            p = p->nextArc;
        }
    }
}

int main(int argc, const char * argv[]) {
     
    AGraph* G = new AGraph();
    initAGraph(G);
    for (int i = 0; i < G->e; i++) {
     
        if (visit[i] == 0) {
     
            DFS(G, i);
        }
    }
    return 0;
}

좋은 웹페이지 즐겨찾기