判断无向图是否是树

一个无向图G是一颗树的条件:
G必须是无回路的连通图或者是n-1条边的连通图

思路: 如果能通过一次dfs就能够访问图中所有顶点, 并且访问的边是n-1条则此图是一个棵树

void dfs(ALGraph graph, int v, bool visit[], int &vnum, int &arcnum)
{
    visit[v] = true;
    vnum++;
    for(ArcNode* edge = graph.adjList[v].first; edge != NULL; edge = edge->next)
    {
        if(!visit[edge->adjvex])
        {
            arcnum++;
            dfs(graph, edge->adjvex, visit, vnum, arcnum);
        }
    }
}

/*
    一个无向图G是一颗树的条件:
    G必须是无回路的连通图或者是n-1条边的连通图
*/
bool isTree(ALGraph graph)
{
    bool visit[MAX_NUM];
    memset(visit, 0, sizeof(visit));
    int vnum = 0, arcnum = 0;//访问过顶点的个数,边的条数
    dfs(graph, 1, visit, vnum, arcnum);
    if(vnum == graph.vexnum && arcnum ==  graph.vexnum - 1)
        return true;
    return false;
}

  

参考: 王道考研数据结构复习指导

时间: 2024-08-03 20:21:07

判断无向图是否是树的相关文章

poj 2513 欧拉回路+并查集判断是否联通+Trie树

http://poj.org/problem?id=2513 最初看到 第一感觉---map  一看250000的数据量 果断放弃 然后记得以前看过,trie代替map,尤其当数据量特别大的时候 学到了: 1.Trie代替map的思想,可以在单词结尾的tree[i][tk]  这个i作为字符串对应的int值 ,当然这个int值也可以用于建立并查集 2.接上,通过并查集判断,所有的点在同一个集合图就是联通的,否则不联通,注意tree[i][tk]>0 表示是单词结尾, x=Find(x);//这句

并查集(1)-判断无向图是否存在环

并查集是一种树型的数据结构,用于处理一些不相交集合(Disjoint Sets)的合并及查询问题.常常在使用中以森林来表示.集就是让每个元素构成一个单元素的集合,也就是按一定顺序将属于同一组的元素所在的集合合并. Find:确定元素属于哪一个子集.它可以被用来确定两个元素是否属于同一子集合. Union:将两个子集合并成同一个集合. 其实判断一个图是否存在环已经有相应的算法,此文用并查集来判断一个图是否有环. 我们可以用一个一维数组parent[] 来记录子集合. 看下面这个图: 0 | | 1

hdu 1325 判断有向图是否为树

题意:判断有向图是否为树 链接:点我 这题用并查集判断连通,连通后有且仅有1个入度为0,其余入度为1,就是树了 1 #include<cstdio> 2 #include<iostream> 3 #include<algorithm> 4 #include<cstring> 5 #include<cmath> 6 #include<queue> 7 #include<map> 8 using namespace std;

笔试算法题(27):判断单向链表是否有环并找出环入口节点 &amp; 判断两棵二元树是否相等

出题:判断一个单向链表是否有环,如果有环则找到环入口节点: 分析: 第一个问题:使用快慢指针(fast指针一次走两步,slow指针一次走一步,并判断是否到达NULL,如果fast==slow成立,则说明链表有环): 第二个问题:fast与slow相遇时,slow一定还没有走完一圈(反证法可证明):  示意图A为起始点,B为环入口点,C为相遇点,则a1=|AB|表示起始点到换入口的距离,a2=|CB|表示相遇点到环入口点的距离,s1=|AB|+|BC|表示slow指针走的长度,s2表示fast指针

判断无向图是否有回路(是否有环)

总体思路: (1)通过广度遍历(BFS)访问图的所有点,对于每个点,都检测和已访问过的点是否有边(除了和它连接的上层节点). (1.1)如果有边,说明有回路(有环).如果对于每个点,都没有和已访问过的点有边,说明从该点出发的当前图没有回路(无环). (2)如果从任意点开始的BFS,以上操作(1)均说明无回路,则没有回路. 适用范围: (1)判断图添加一条无向边后是否有回路.只要从这条新边的一个点出发执行操作(1)即可. (2)判断一个图是否有回路.需要从任意点都执行一次操作(1),只有所有操作(

判断无向图/有向图中是否存在环

本文主要针对如何判断有向图/无向图中是否存在环的问题进行简单的论述. 一 无向图 1.利用DFS进行判断 利用DFS判断有向图是否存在环,是最为常用的一种方法,虽然这种方法很常用,但可参考的代码的实现比较少,下面对这种方法及其实现进行详细的阐述. 首先,利用DFS判断无向图中是否换的原理是:若在深度优先搜索的过程中遇到回边(即指向已经访问过的顶点的边),则必定存在环. 所以说,是否存在环的关键在于是否存在满足条件的"回边",那么如何判断回边呢? (1)首先,对图中的所有顶点定义三种状态

HDU-1878 判断无向图欧拉回路,水

HDU 1878 题意:问一个无向图是否存在欧拉回路. 总结: 1.一个无向图存在欧拉回路,当且仅当该图所有顶点度数都为偶数,且该图是连通图.2.一个有向图存在欧拉回路,所有顶点的入度等于出度且该图是连通图.3.要判断一个混合图G(V,E)(既有有向边又有无向边)是欧拉图,方法如下:假设有一张图有向图G',在不论方向的情况下它与G同构.并且G'包含了G的所有有向边.那么如果存在一个图G'使得G'存在欧拉回路,那么G就存在欧拉回路. // HDU-1878 #include<bits/stdc++

如何判断无向图有环

有向图有无环可用拓扑排序进行检查,当拓扑排序后选出的点不是所有的点集,则该图有环. 但无向图无法使用拓扑排序. 无向图可使用深度优先搜索来寻找有无环,当搜索的当前节点的下一个邻接点(当前顶点的父顶点不算)已被访问过时,便有环.可通过简单修改递归DFS的代码来实现判断当前图有无环. 1 void GraphAdjacencyListWeight::DFSRecursively(int StartVertex) { 2 int *visited = new int[VertexNumber]; 3

cf290-2015-2-3总结与反思(dfs判断无向图是否有环)

bool dfs(int i,int pre) { visit[i]=true; for(int j=1;j<=v;j++) if(g[i][j]) { if(!visit[j]) return dfs(j,i); else if(j!=pre) //如果访问过,且不是其父节点,那么就构成环 return false; } } 方法:从一个顶点出发深度优先遍历可遍历所有结点,并且没有环或只有n-1条边. 若判断有环:可以在遍历时记住父结点,v的子结点w已被访问,且不是结点v的父结点,则存在环.