深度优先搜索

此深度优先搜索是针对于有向图的,在实现中并未构造深度搜索树。即不使用树来实现对有向图的深度优先搜索。
下面是MapInfo.txt文件中的内容,此文件保存着有向图的邻接矩阵。
0 1 0 1 0 0
0 0 0 0 1 0
0 0 0 0 1 1
0 1 0 0 0 0
0 0 0 1 0 0
0 0 0 0 0 1
程序会先读取此邻接矩阵的内容,然后构建一个邻接表,最后在邻接表上实现对此有向图的深度优先搜索。
代码实现如下:

/*
 * 深度优先搜索
 * 有向图 不构建深度搜索树
 *           Author: StoryMonster
 * last change date: 2016/6/30
 */
#include <iostream>
#include <stdio.h>
#include <stdlib.h>

enum {White,Grey,Black};
typedef struct MapNode
{
    int NodeName;
    int color;
    struct MapNode *next;
} MapNode;

MapNode *Head[6];
static void ReadConfigFile();
static void InsertToMap(MapNode *, MapNode *);
static void Deepth_First_Search(void);
static void Search(MapNode *);

void ColorAll(int NodeName, int color)
{
    for(int i=0;i<6;i++)
    {
        MapNode *p = Head[i];
        while(p!=NULL)
        {
            if(p->NodeName == NodeName)
            {
                p->color = color;
            }
            p = p->next;
        }
    }
}
MapNode *GetNode(int name)
{
    for(int i=0;i<6;i++)
    {
        if(name == i+1)
            return Head[i];
    }
}
void Search(MapNode *root)
{
    if(root == NULL) return ;
    if(root->color == White)
    {
        root->color = Grey;
        ColorAll(root->NodeName,Grey);
        std::cout << root->NodeName << std::endl;
    }
    MapNode *p = root->next;
    while(p!=NULL)
    {
        if(p->color == White)
        {
            p->color = Grey;
            ColorAll(p->NodeName,Grey);
            std::cout << p->NodeName << std::endl;
            Search(GetNode(p->NodeName));
        }
        p = p->next;
    }
    root->color = Black;
}
void Deepth_First_Search(void)
{
    for(int i=0;i<6;i++)
    {
        if(Head[i]->color == White)
        {
            Search(Head[i]);
        }
    }
}
void InsertToMap(MapNode *head, MapNode *node)
{
    if(head == NULL)
    {
        head = node;
        return ;
    }
    MapNode *p = head;
    while(p->next != NULL) p = p->next;
    p->next = node;
}
void ReadConfigFile(void)
{
    FILE *fp = fopen("MapInfo.txt","rb");
    if(!fp)
    {
        std::cout << "Open MapInfo.txt failed!" <<std::endl;
        fp = NULL;
        return ;
    }
    int index = 0;
    int arr[6] = {0};
    while(1)
    {
        int n = fscanf(fp,"%d %d %d %d %d %d",&arr[0],&arr[1],&arr[2],&arr[3],&arr[4],&arr[5]);
        if(n < 1) break;
        for(int i =0;i<6;i++)
        {
            if(arr[i])
            {
                MapNode *node =(MapNode *)malloc(sizeof(MapNode));
                node->NodeName = i+1;
                node->next     = NULL;
                node->color    = White;
                InsertToMap(Head[index],node);
            }
        }
        index++;
    }
    fclose(fp);
    fp = NULL;
}
int main()
{
    for(int i=0;i<6;i++)
    {
        Head[i] = (MapNode *)malloc(sizeof(MapNode));
        Head[i]->next = NULL;
        Head[i]->color= White;
        Head[i]->NodeName = i+1;
    }
    ReadConfigFile();
    Deepth_First_Search();
    return 0;
}

使用本代码实现对有向图的深度优先搜索当然在性能上比不上使用深度优先搜索树,因为在邻接表中为很多重复节点分配了内存。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值