美文网首页
判断一个有向图是否有环

判断一个有向图是否有环

作者: analanxingde | 来源:发表于2018-05-10 10:04 被阅读28次

采用深度优先遍历

#include<iostream>
#include<malloc.h>
using namespace std;
#define maxNum 100 //定义邻接举证的最大定点数
int point=0;//pre和post的值
bool is_DAG=true;//标识位,表示有向无环图
/*
顶点颜色表 color[u]
   0 白色,未被访问过的节点标白色
   -1 灰色,已经被访问过一次的节点标灰色
   1 黑色,当该节点的所有后代都被访问过标黑色
反向边:
   如果第一次访问(u,v)时v为灰色,则(u,v)为反向边。在对图的深度优先搜索中没有发现
   反向边,则该图没有回路
程序判断依据:
    仍然是按图的节点深度遍历,访问到V时,V若被访问过,那么有2种状态:
    color[u]=-1,程序跳出,存在环
    color[u]=1,程序继续,这不是环
时间复杂度:O(n+e)
*/
int color[maxNum];//顶点颜色表 color[u]
//图的邻接矩阵表示结构
typedef struct
{
    char v[maxNum];//图的顶点信息
    int e[maxNum][maxNum];//图的顶点信息
    int vNum;//顶点个数
    int eNum;//边的个数
}graph;
void createGraph(graph *g);//创建图g
void DFS(graph *g);//深度优先遍历图g
void dfs(graph *g,int i);//从顶点i开始深度优先遍历与其相邻的点
void dfs(graph *g,int i)
{
    //cout<<"顶点"<<g->v[i]<<"已经被访问"<<endl;
    cout<<"顶点"<<i<<"已经被访问"<<endl;
    color[i]=-1;
    for(int j=1;j<=g->vNum;j++)
    {
        if(g->e[i][j]!=0)
        {
            if(color[j]==-1)//探索到回边,存在环
            {
                is_DAG=false;//不是有向无环图
            }
            else if(color[j]==0)
                dfs(g,j);
        }
    }
    color[i]=1;//表示i的后裔节点都被访问过
}
void DFS(graph *g)
{
    int i;
    //初始化color数组,表示一开始所有顶点都未被访问过,//初始化pre和post
    for(i=1;i<=g->vNum;i++)
    {
        color[i]=0;
    }
    //深度优先搜索
    for(i=1;i<=g->vNum;i++)
    {
        if(color[i]==0)//如果这个顶点为被访问过,则从i顶点出发进行深度优先遍历
        {
            dfs(g,i);

        }
    }
}
void createGraph(graph *g)//创建图g
{
    cout<<"正在创建无向图..."<<endl;
    cout<<"请输入顶点个数vNum:";
    cin>>g->vNum;
    cout<<"请输入边的个数eNum:";
    cin>>g->eNum;
    int i,j;
    //初始画图g
    for(i=1;i<=g->vNum;i++)
        for(j=1;j<=g->vNum;j++)
            g->e[i][j]=0;
    //输入边的情况
    cout<<"请输入边的头和尾"<<endl;
    for(int k=1;k<=g->eNum;k++)
    {
        cin>>i>>j;
        g->e[i][j]=1;
    }
}
int main()
{
    graph *g;
    g=(graph*)malloc(sizeof(graph));
    createGraph(g);//创建图g
    DFS(g);//深度优先遍历
    if(is_DAG)
        cout<<"图g是有向无环图,没有环"<<endl;
    else
        cout<<"图g不是有向无环图,存在环"<<endl;
    int k;
    cin>>k;
    return 0;
}

相关文章

  • 判断有向图是否有环

    方法一:拓扑排序 时间复杂度O(n^2) 比较常用的是用拓扑排序来判断有向图中是否存在环。 什么是拓扑排序呢?我们...

  • 有向图判断是否有环

    深度优先算法:注意flag入栈出栈; 广度优先算法:拓扑序列,不断删去入度为0的节点。

  • 判断有向图是否有环

    问题来源于做题 力扣-顺丰科技智慧物流校园技术挑战赛[https://leetcode.cn/contest/sf...

  • 数据结构

    1.判断一个有向图是否有环? 深度优先搜遍历 拓扑排序

  • 判断一个有向图是否有环

    采用深度优先遍历

  • 判断无向图和有向图是否有环

    无向图 方法1(数学方法): 图的顶点数为n,边数为m,若n>=m+1,则无环;否则有环。方法2:使用并查集进行判...

  • 判断有向图有环

    拓扑排序如果能够用拓扑排序完成对图中所有节点的排序的话,就说明这个图中没有环,而如果不能完成,则说明有环。[1] ...

  • 关于图的几个常用算法

    BFS判断是否有路 因为只是判断是否有路,所以适用于有向、无向、有环、无环、非加权,复杂度是O(V+E),判断是否...

  • LeetCode 207-Course Schedule

    分析 很显然,这是一个有向无环图的判断问题。只要所有课程中出现了环,就不可能修满所有课程。有向无环图的判断可采用d...

  • 18-拓扑排序

    拓扑排序## 拓扑排序是针对有向无环图定义的,此算法可以判断一个有向图是否存在回路。拓扑排序反应的是活动和工程的先...

网友评论

      本文标题:判断一个有向图是否有环

      本文链接:https://www.haomeiwen.com/subject/yhyplftx.html