图结构练习——判断给定图是否存在合法拓扑序列

来源:互联网 发布:江苏海纳船务知乎 编辑:程序博客网 时间:2024/05/16 08:56

图结构练习——判断给定图是否存在合法拓扑序列

Time Limit: 1000MS Memory limit: 65536K

题目描述

 给定一个有向图,判断该有向图是否存在一个合法的拓扑序列。

输入

 输入包含多组,每组格式如下。
第一行包含两个整数n,m,分别代表该有向图的顶点数和边数。(n<=10)
后面m行每行两个整数a b,表示从a到b有一条有向边。
 

输出

 若给定有向图存在合法拓扑序列,则输出YES;否则输出NO。
 

示例输入

1 02 21 22 1

示例输出

YESNO

提示

 

来源

 赵利强

示例程序

 非课本方法
#include <iostream>#include <stdio.h>#include <stdlib.h>#include <string.h>#include <queue>using namespace std;int n, m, count, flag;int map[11][11], visit[11];int dfs(int x){    visit[x] = -1;                                  //表示正在访问.....     (莫名其妙)    for(int i = 0; i < n; i++)                      //遍历节点所在行的所有边,如果有关系,就是说两个节点之间有连线    {        if(map[x][i] == 1)        {            if(visit[i] == -1)                      //当访问到正在访问的节点,就是说它自身成环了                return 0;            else if(visit[i] == 0 && dfs(i) == 0)   //如果没有访问过,但是以下一个节点成环了                return 0;        }    }    visit[x] = 1;                                   //标记为访问    return 1;}int topo(){    for(int i = 0; i < n; i++)                      //遍历所有节点,如果节点没有遍历过,先去深搜,并判断它自己是不是成环,成环直接跳出,不然遍历所有的节点    {        if(visit[i] == 0)                           //当节点没有被遍历,就让节点去dfs(),通过返回的值判断是否成环        {            if(dfs(i) == 0)                return 0;        }    }    return 1;}int main(){    while(cin >> n >> m)    {        memset(map, 0, sizeof(map));        memset(visit, 0, sizeof(visit));        for(int i = 0; i < m; i++)        {            int a, b;            cin >> a >> b;            map[a - 1][b - 1] = 1;        }        int y = topo();        if(y == 1)            cout << "YES" << endl;        else            cout << "NO" << endl;    }    return 0;}


0 0
原创粉丝点击