当前位置: 首页 > 知识库问答 >
问题:

确定无向图是否为树

许照
2023-03-14

我对什么是有向图和无向图进行了研究。我的方法是使用DFS算法。我知道当visitedM[iVertices]true或节点被访问两次时,这意味着它不是树。我还使用下面的定理来确定一个图是否是一棵树。

Theorem: Any connected graph with n vertices and n-1 edges is a tree

我的代码是通过从文件中读取顶点数和边数来初始化的,如下所示

6 7
1 2
1 5
1 6
2 5

正如您所看到的,每条边与源顶点和目标顶点列在一条线上。顶点从1开始。边是无向的,一旦以最小顶点id开始,将在文件中列出。例如,对于边2-5和5-2,文件将仅具有2-5。

我的问题是,我不知道是否应该分配节点内存,如何将节点插入到图中,如何从DFS代码中分辨出不是树。我还有void dfs作为一个int函数,返回访问顶点的计数<代码>整数dft(图形*g、整数iV、整数VisitedM[])。该函数类似于myvoid DFS,但如果visitedM[iV],则返回0,visitedM[iV]=TRUE,并返回iCount。我还认为我的数据结构很混乱。

#define MAX_VERTICES 100
typedef struct EdgeNode
{
    int y;
    int w;          //weight
    int iVertex     //susbcript in vertexM for TO Vertex
    struct EdgeNode *pNextEdge;
}EdgeNode;

typedef struct Vertex
{
    char szLabel[100 +1 ];
    EdgeNode *successorList;
}Vertex;

typedef struct
{
    int iNumVertices;
    int iNumEdges;
    int iDirected;
    Vertex vertexM[MAX_VERTICES +1];

    int iParent[MAX_VERTICES + 1];
    int iVisitedM[MAX_VERTICES + 1];

    int degree[MAX_VERTICES + 1];
    EdgeNode *edge[MAX_VERTICES +1];
}GraphImp;
typedef GraphImp *Graph;


    int main(int argc, char *argv[])
    {
        FILE *pFile;
        Graph graph;
        char szInputBuffer[100];
        int numEdges, numVertices;
        pFile = fopen("a.txt","r");

        if( pFile == NULL)
        {
            printf("FILE DOES NOT EXIST \n");
            return;
        }
        //reads file until EOF
        while(fscanf(pFile, "%d%d", &graph.iVertices, &graph.iEdges) != EOF)
        {
            //printf is to track the input from file
            printf("num of vertices: %d \n num of edeges: %d \n",graph.iVertices, graph.iEdges);
        }

        fclose(pFile);
    }
            void dft(Graph *g, int iV, int visitedM[])
        {
            EdgeNode *e;
            if(visitedM[iV])
                return;
            for( e = g->vertexM[iV].sucessorList; e!= NULL; e = e->pNextEdge)
            {
                dft(g, e->iVertex, visitedM);
            }
        }

共有1个答案

郭博涉
2023-03-14

让我给你一个稍微不同的方法来解决这个问题。

给定问题{6,7},{1,2},{1,5},{1,6},{2,5}中的边集,有5个顶点{1,2,5,6,7}和5条边。我们立即得出结论,图不可能是树,因为根据定理,一个有5个顶点的图必须有4条边。

要使问题变得更难,请删除其中一条边,留下{{6,7},{1,2},{1,6},{2,5}。现在我们有了正确的边数,所以根据定理,我们只需要证明图是连通的。这可以通过给图形着色来完成。

要给图形着色,请实现以下三条规则

  • 如果一条边连接两个未着色的顶点,则为这些顶点指定新颜色
  • 如果边将有色顶点连接到未着色顶点,请将颜色指定给未着色顶点
  • 如果边连接两个不同颜色的顶点,则将这些颜色合并为一种颜色

如果每个顶点最终都有相同的颜色,那么这个图是相连的。

下表显示了处理每个边缘时颜色分配是如何随时间变化的。

       |     color assignments 
vertex | start {6,7} {1,2} {1,6} {2,5} 
-------+-------------------------------
  1    |   0     0     2     1     1
  2    |   0     0     2     1     1
  3    |   0     0     0     0     0
  4    |   0     0     0     0     0
  5    |   0     0     0     0     1
  6    |   0     1     1     1     1
  7    |   0     1     1     1     1

开始时,所有顶点均未着色,由数字0表示。第一条边{6,7}为顶点6和7指定新颜色。第二条边{1,2}为顶点1和2指定新颜色。第三条边{1,6}连接具有不同颜色的顶点,因此颜色为2的所有顶点都将更改为颜色1。最后一条边{2,5}将有色顶点与未着色顶点连接起来,因此颜色1被指定给顶点5。

处理完所有边后,所有着色顶点都具有相同的颜色,因此图形是连接的。此外,边的数量比顶点的数量少一个。因此,图形是一棵树。

 类似资料:
  • 如果二叉树是使用递归的bst,我正在尝试编写一个bool函数来返回true,我需要一些关于haskell语法的指导。 我知道要使二叉树成为 bst,左侧子树必须始终仅包含小于头部的节点。并且右侧子树必须始终仅包含大于头部的节点。我正在这样构建我的函数: 但是此代码会导致错误: 无法将预期类型“Bool”与实际类型“Int”匹配 参考

  • 问题内容: 好的,我的问题不是如何确定数字是否为质数,因为我想我已经知道了,但是更多的是如何使其正确显示。 这是我的代码: 现在我的问题是,如果数字最终等于9,它会说它是质数,而不是。我认为问题在于中断在一个循环后就停止了它,因此它不会递增变量p,因此仅测试除以2(我认为)。但是,如果我删除断点,它将在每次通过时打印出“和不是素数”,直到退出循环为止。不知道该怎么办。 问题答案: 查找数字是否为素

  • 问题内容: 我正在尝试确定给定类型()是否为可选类型,我正在使用此测试 但它始终返回false。 那么有什么办法可以做到这一点? 问题答案: 假设您要执行的操作是这样的: 可悲的是,swift当前(从Swift 2开始)不支持协方差和协变,并且不能直接针对类型进行类型检查: 一种替代方法是使特定协议扩展,并检查该类型:

  • 我在找一个算法(或者其他什么方法)来确定一个给定的加权图在O(ElogV)中是否有唯一的MST(最小生成树)? 我对体重一无所知(如体重(e1)!= weight(e2)),如果该图只有一个唯一的MST,则算法返回True,否则返回False。 我首先使用 Kruskal 的算法,并检查 find-set(u)==find-set(v) 是否因此在 MST 中有一个圆圈,但这种方式并没有涵盖我认为

  • 问题内容: 使用PHP(给定URL),如何确定它是否是图像? URL没有上下文-它只是在纯文本文件的中间,或者可能只是一个字符串。 我不希望开销很大(例如,读取URL的内容),因为页面上的许多URL都可以调用此方法。鉴于此限制,识别所有图像并不是必需的,但是我想作一个很好的猜测。 目前,我只是在看文件扩展名,但是感觉应该有比这更好的方法。 这是我目前拥有的: 编辑: 如果对其他人有用,这里是使用E

  • 问题内容: 我在Java中使用PdfBox从PDF文件提取文本。提供的某些输入文件无效,这些文件上的PDFTextStripper暂停。有没有一种干净的方法来检查提供的文件是否确实是有效的PDF? 问题答案: 您可以找出文件(或字节数组)的mime类型,因此不必盲目地依赖扩展名。我是用光圈的MimeExtractor(http://aperture.sourceforge.net/)来完成的,或者