06-图1 列出连通集

#define MaxVertexNum 120
#include "stdio.h"
#include <stdlib.h>
#include <queue>
using namespace std;


typedef int WeightType;
typedef int DataType;
typedef int Vertex;

typedef  struct GNode* PtrToGNode;
struct GNode {
    int Nv;
    int Ne;
    WeightType G[MaxVertexNum][MaxVertexNum];
    DataType Data[MaxVertexNum];
};
typedef PtrToGNode MGraph;

typedef struct ENode* PtrToENode;
struct ENode {
    Vertex V1, V2;
    WeightType Weight;
};
typedef PtrToENode Edge;

MGraph createGraph( int VertexNum ) {
    Vertex V, M;
    MGraph Graph;
    Graph = (MGraph) malloc(sizeof(struct GNode));
    
    Graph->Ne = 0;
    Graph->Nv = VertexNum;
    
    for (V = 0; V<VertexNum; V++) {
        for(M = 0; M<VertexNum; M++) {
            Graph->G[V][M] = 0;
        }    
    }
    return Graph;
}

void InsertEdge(MGraph Graph, Edge E) {
    Graph->G[E->V1][E->V2] = E->Weight;
    //undirected graph
    Graph->G[E->V2][E->V1] = E->Weight;
}

MGraph buildGraph() {
    MGraph Graph;
    int Nv;
    Vertex V;
    Edge E;
    
    scanf( "%d", &Nv );
    Graph = createGraph(Nv);
    
    scanf( "%d", &(Graph->Ne) );
    if(Graph->Ne){
        E = (Edge) malloc(sizeof(struct ENode));
        for(int i=0; i<Graph->Ne; i++) {
            scanf("%d %d", &(E->V1), &(E->V2));
            E->Weight = 1;
            InsertEdge(Graph, E);
        }
    }
    
    /*
    for(V = 0; V < Graph->Nv; V++) {
        scanf("%d", Graph->Data[V]);
    }
    */
    return Graph;
}

int Visted[MaxVertexNum] = {0};
void reset(int a[], int bound) {
    for (int i=0;i<bound;i++) {
        a[i] = 0;
    }
}

void DFS(MGraph Graph, Vertex V) {
    
    printf("%d ", V);
    Visted[V] = 1;
    Vertex M;
    
    for (M = 0; M<Graph->Nv; M++) {
        if (Graph->G[V][M] and !Visted[M]) {
            DFS(Graph, M);
        }
    }
    
}


void BFS(MGraph Graph, Vertex V) {
    queue< Vertex > Q;
    Vertex E;
    
    printf("%d ", V);
    Visted[V] = 1;
    Q.push(V);
    
    while(!Q.empty()) {
        E = Q.front();
        Q.pop();
        
        for(Vertex W = 0; W < Graph->Nv; W++) {
            if(!Visted[W] and Graph->G[E][W] == 1) {
                printf("%d ", W);
                Visted[W] = 1;
                Q.push(W);
            }
        }
    }
    
    
}

void search(MGraph Graph, Vertex V, void(*f)(MGraph Graph, Vertex V)) {
    reset(Visted, MaxVertexNum);
    for(V=0; V<Graph->Nv; V++) {
        if (!Visted[V]) {
            printf("{ ");
            f(Graph, V);
            printf("}\n");
            
        }
    }
    
}


int main() {
    MGraph Graph = buildGraph();
    Vertex V;
    
    search(Graph, V, DFS);
    search(Graph, V, BFS);
}

 

posted @ 2019-04-17 15:13  Acoccus  阅读(171)  评论(0编辑  收藏  举报