您的位置:首页 > 其它

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

2016-08-18 21:29 246 查看


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



Time Limit: 1000MS Memory limit: 65536K


题目描述

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


输入

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


输出

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


示例输入

1 0
2 2
1 2
2 1



示例输出

YES
NO



提示

 


来源

 赵利强


示例程序

 非课本方法

#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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: