NOJ1047 图的深度优先遍历序列

#include<stdio.h> // printf()
#include<stdlib.h> // malloc(), free()
#include<limits.h> // INT_MAX for noEdgeValue

typedef int ElemType;

typedef int BOOL;
#define TRUE 0
#define FALSE -1

////////////////////////////////////////////////////////////////////////////////
// P.34
// Program 3.2 Queue
typedef struct
{
    int front;
    int rear;
    int maxSize;
    ElemType* element;
}Queue;

void Create(Queue* Q, int mSize)
{
    Q->maxSize = mSize;
    Q->element = (ElemType*)malloc(sizeof(ElemType) * mSize);
    Q->front = Q->rear = 0;
}

// Function name conflicted with Destroy() of mGraph, so I changed its name...
void Destroy_Queue(Queue* Q)
{
    Q->maxSize = -1;
    free(Q->element);
    Q->front = Q->rear = -1;
}

BOOL IsEmpty(Queue* Q)
{
    return Q->front == Q->rear;
}

BOOL IsFull(Queue* Q)
{
    return (Q->rear + 1) % Q->maxSize == Q->front;
}

BOOL Front(Queue * Q, ElemType * x)
{
    if (IsEmpty(Q))
        return FALSE;

    *x = Q->element[(Q->front + 1) % Q->maxSize];

    return TRUE;
}

BOOL EnQueue(Queue * Q, ElemType x)
{
    if (IsFull(Q))
        return FALSE;

    Q->rear = (Q->rear + 1) % Q->maxSize;
    Q->element[Q->rear] = x;

    return TRUE;
}

BOOL DeQueue(Queue * Q)
{
    if (IsEmpty(Q))
        return FALSE;

    Q->front = (Q->front + 1) % Q->maxSize;

    return TRUE;
}

void Clear(Queue * Q)
{
    Q->front = Q->rear = 0;
}
////////////////////////////////////////////////////////////////////////////////

////////////////////////////////////////////////////////////////////////////////
// MGraph
// P.139 - 141

// P.139
typedef int ElemType;
typedef struct
{
    ElemType** a;
    int n;
    int e;
    ElemType noEdge;
}mGraph;

// P.139 Program 9.1
#define ERROR 0
#define OK 1
#define Overflow 2
#define Underflow 3
#define NotPresent 4
#define Duplicate 5
typedef int Status;

Status Init(mGraph * mg, int nSize, ElemType noEdgeValue)
{
    int i, j;

    mg->n = nSize;
    mg->e = 0;
    mg->noEdge = noEdgeValue;
    mg->a = (ElemType * *)malloc(nSize * sizeof(ElemType*));
    if (!mg->a)
        return ERROR;

    for (i = 0; i < mg->n; i++)
    {
        mg->a[i] = (ElemType*)malloc(nSize * sizeof(ElemType));

        for (j = 0; j < mg->n; j++)
            mg->a[i][j] = mg->noEdge;

        mg->a[i][i] = 0;
    }

    return OK;
}

// P.140 Program 9.2
void Destroy(mGraph * mg)
{
    int i;

    for (i = 0; i < mg->n; i++)
        free(mg->a[i]);

    free(mg->a);
}

// P.140 Program 9.3
Status Exist(mGraph * mg, int u, int v)
{
    if (u<0 || v<0 || u>mg->n - 1 || v>mg->n - 1 || u == v || mg->a[u][v] == mg->noEdge)
        return ERROR;

    return OK;
}

// P.140 Program 9.4
Status Insert(mGraph * mg, int u, int v, ElemType w)
{
    if (u<0 || v<0 || u>mg->n - 1 || v>mg->n - 1 || u == v)
        return ERROR;

    if (mg->a[u][v] != mg->noEdge)
        return Duplicate;

    mg->a[u][v] = w;
    mg->e++;

    return OK;
}

// P.140 Program 9.5
Status Remove(mGraph * mg, int u, int v)
{
    if (u<0 || v<0 || u>mg->n - 1 || v>mg->n - 1 || u == v)
        return ERROR;

    if (mg->a[u][v] == mg->noEdge)
        return NotPresent;

    mg->a[u][v] = mg->noEdge;
    mg->e--;

    return OK;
}
////////////////////////////////////////////////////////////////////////////////

////////////////////////////////////////////////////////////////////////////////
// DFS
// There are not any DFS programs based on MGraph in the textbook, 
// so I made it...
void DFS(int v, int visited[], mGraph g)
{
    int i;

    printf("%d ", v);
    visited[v] = 1;

    for (i = 0; i < g.n; i++)
    {
        if (g.a[v][i] != 0 && g.a[v][i] != g.noEdge && !visited[i])
        {
            DFS(i, visited, g);
        }
    }
}

void DFSGraph(mGraph g)
{
    int i;

    // Init visited
    int* visited = malloc(g.n * sizeof(int));
    for (i = 0; i < g.n; i++)
        visited[i] = 0;

    // Do DFS
    for (i = 0; i < g.n; i++)
    {
        if (!visited[i])
        {
            DFS(i, visited, g);
        }
    }

    free(visited);
}
////////////////////////////////////////////////////////////////////////////////

////////////////////////////////////////////////////////////////////////////////
// BFS
// There are not any BFS programs based on MGraph in the textbook, 
// so I made it...
void BFS(int v, int visited[], mGraph g)
{
    int i;

    Queue q;
    Create(&q, g.n);

    visited[v] = 1;
    printf("%d ", v);

    EnQueue(&q, v);
    while (!IsEmpty(&q))
    {
        Front(&q, &v);
        DeQueue(&q);

        for (i = 0; i < g.n; i++)
        {
            if (g.a[v][i] != 0 && g.a[v][i] != g.noEdge && !visited[i])
            {
                visited[i] = 1;
                printf("%d ", i);
                EnQueue(&q, i);
            }

        }
    }
}

void BFSGraph(mGraph g)
{
    int i;

    // Init visited
    int* visited = malloc(g.n * sizeof(int));
    for (i = 0; i < g.n; i++)
        visited[i] = 0;

    // Do BFS
    for (i = 0; i < g.n; i++)
    {
        if (!visited[i])
        {
            BFS(i, visited, g);
        }
    }

    free(visited);
}
////////////////////////////////////////////////////////////////////////////////

////////////////////////////////////////////////////////////////////////////////
int main()
{
    mGraph GBA;
    int nSize = 0, edge = 0;
    int u = 0, v = 0;
    scanf("%d %d", &nSize, &edge);
    Init(&GBA, nSize, 0);
    for (int a = 0; a < edge; a++)
    {
        scanf("%d %d", &u, &v);
        Insert(&GBA, u, v, 1);
        Insert(&GBA, v, u, 1);
    }
    for (int f = 0; f < nSize; f++)
    {
        for (int r = 0; r < nSize; r++)
            printf("%d ", GBA.a[f][r]);
        printf("\n");
    }
    DFSGraph(GBA);

    Destroy(&GBA);

    return 0;
}

NOJ1047 图的深度优先遍历序列》有1个想法

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注