图结构练习——判断给定图是否存在合法拓扑序列
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; }
相关文章推荐
- 图结构练习——判断给定图是否存在合法拓扑序列
- 图结构练习——判断给定图是否存在合法拓扑序列
- 图结构练习——判断给定图是否存在合法拓扑序列
- 图结构练习——判断给定图是否存在合法拓扑序列
- 图结构练习——判断给定图是否存在合法拓扑序列
- SDUT 图结构练习——判断给定图是否存在合法拓扑序列
- 图结构练习——判断给定图是否存在合法拓扑序列
- 图结构练习——判断给定图是否存在合法拓扑序列
- SDUT OJ 2140 图结构练习——判断给定图是否存在合法拓扑序列
- 图结构练习——判断给定图是否存在合法拓扑序列
- SDUT2140_图结构练习——判断给定图是否存在合法拓扑序列(邻接表)
- 图结构练习——判断给定图是否存在合法拓扑序列
- 图结构练习——判断给定图是否存在合法拓扑序列(拓扑排序判断环)
- 图结构练习——判断给定图是否存在合法拓扑序列
- 图结构练习——判断给定图是否存在合法拓扑序列
- 图结构练习——判断给定图是否存在合法拓扑序列(sdutoj)
- SDUT2140图结构练习——判断给定图是否存在合法拓扑序列
- 图结构练习——判断给定图是否存在合法拓扑序列
- 图结构练习——判断给定图是否存在合法拓扑序列
- 图结构练习——判断给定图是否存在合法拓扑序列