注册 登录
编程论坛 数据结构与算法

邻接矩阵图的深度优先遍历

Ocean1 发布于 2016-12-03 20:51, 9444 次点击
图的深度优先遍历
输入邻接矩阵,输出深度优先遍历
按行排列的邻接矩阵A,矩阵每行元素占用一行,元素间用一个空格间隔,相邻矩阵间用一个空行间隔,处理到文件结束位置为止。
测试数据如下:
Sample Input

0 1 1 0 0
1 0 0 0 1
1 0 0 1 1
0 0 1 0 1
0 1 1 1 0

0 1 1 1
1 0 0 0
1 0 0 1
1 0 1 0

Sample Output

1 2 5 3 4
1 2 3 4
求代码和指教。重谢
7 回复
#2
书生牛犊2016-12-03 22:02
1.邻接矩阵、深度优先遍历,这都是比较经典的算法概念,随便百度一下代码一大堆。。。

2.你给的题目压根就不完整。没法做。。。(不过就算你给了完整的题目我也不会想做,你要代码还是去百度吧。要思路的话,这个题貌似也只需要了解一下该算法就能直接套用了。没什么需要灵活变通的吧。)
#3
Ocean12016-12-04 09:49
回复 2楼 书生牛犊
百度的和这个不一样的,我就是不知道如何直接输入邻接矩阵
#4
xzlxzlxzl2016-12-04 10:20
恶补了下邻接矩阵相关知识,有了些了解,但我还不知道你提供的相关输出数据是如何得来的,看来还是要去恶补什么叫深度优先。你提供的两个矩阵数据是无向的,分别是5个顶点和4个顶点的数据,可相当于下式:
邻接矩阵1
  a b c d e
a 0 1 1 0 0
b 1 0 0 0 1
c 1 0 0 1 1
d 0 0 1 0 1
e 0 1 1 1 0
邻接矩阵2
  a b c d
a 0 1 1 1
b 1 0 0 0
c 1 0 0 0
d 1 0 1 0

对应图形如下:
只有本站会员才能查看附件,请 登录
#5
azzbcc2016-12-04 13:35
回复 3楼 Ocean1
你这个问题问了这么久,反思一下下次如何提问吧

我猜测啊,你提问的是这两个问题之一

如何将给出input数据处理为数组等形式?

看这一行 矩阵每行元素占用一行,元素间用一个空格间隔,相邻矩阵间用一个空行间隔,处理到文件结束位置为止
所以数据读取过程可以一行一行读取到字符串,读到空行或文件结束位置结束。
将读到的数据按 行和空格 先后拆分为n*n个字符串,最后将这n*n个字符串依次转化为整数


如何将给出数据读入邻接矩阵?

这个具体要看你自己的邻接矩阵是如何定义的,以我上次发给你的代码为例
我上次发的代码是使用长度为5的二维数组表示的,所以读入过程就一行代码
程序代码:
int graph[M][M] = {{0, 1, 1, 0, 0},
                                 {1, 0, 0, 0, 1},
                                 {1, 0, 0, 1, 1},
                                 {0, 0, 1, 0, 1},
                                 {0, 1, 1, 1, 0}};

建议你用结构体定义,在结构提中指定矩阵大小(即图的节点数目)


[此贴子已经被作者于2016-12-4 13:39编辑过]

#6
Ocean12016-12-04 21:10
回复 5楼 azzbcc
是第一个问题,不明白怎么回事,不知道怎么输入,可以帮帮我吗
就是已经给出邻接矩阵,怎么按要求将矩阵输入,然后根据深度遍历输出


[此贴子已经被作者于2016-12-4 21:12编辑过]

#7
azzbcc2016-12-05 16:27
回复 6楼 Ocean1
输入重定向到in文件

程序代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdbool.h>

#define M 5

typedef struct __tag_node
{
    int data[M][M];
    int count;
} Graph;

int findNext(int pos, Graph *graph, bool visited[])
{
    for (int i = 0; i < graph->count; ++i)
    {
        if (graph->data[pos][i] && !visited[i]) return i;
    }
    return -1;
}

void dft(Graph *graph)
{
    bool visited[M] = {false};

    printf("Graph(%d)\n", graph->count);
    for (int i = 0; i < graph->count; ++i)
    {
        if (visited[i]) continue;

        visited[i] = true;
        printf("%d ", i);  // 打印节点

        int pos = i;
        while (true)
        {
            pos = findNext(pos, graph, visited);
            if (-1 == pos) break;

            visited[pos] = true;
            printf("%d ", pos);
        }
    }
    printf("\n");
}

int readGraph(Graph *graph)
{
    char str[128] = {0};

    graph->count = 0;
    while (fgets(str, 128, stdin) != NULL)
    {
        if (str[0] == '\n') return graph->count;
        str[strlen(str) - 1] = '\0'; // 去除fgets读到的换行符

        int pos = 0;
        char *p = strtok(str, " ");
        do
        {
            graph->data[graph->count][pos++] = atoi(p);
            p = strtok(NULL, " ");
        } while (p != NULL);

        graph->count += 1;
    }
    return EOF;
}

int main(int argc, char *argv[])
{
    int flag;
    Graph graph;

    freopen("in", "r", stdin);
    do
    {
        flag = readGraph(&graph);
        if (flag == 0) continue;
        if (graph.count > 0) dft(&graph);
    } while (flag != EOF);

    fclose(stdin);

    return 0;
}
#8
xzlxzlxzl2016-12-05 16:34
回复 7楼 azzbcc
根据题主的要求,你的输出结果要+1.你的输出是0 1 4 2 3
1