数据结构实验之图论十:判断给定图是否存在合法拓扑序列
2017-12-02 16:23
357 查看
Problem Description
给定一个有向图,判断该有向图是否存在一个合法的拓扑序列。
Input
输入包含多组,每组格式如下。
第一行包含两个整数n,m,分别代表该有向图的顶点数和边数。(n<=10)
后面m行每行两个整数a b,表示从a到b有一条有向边。
Output
若给定有向图存在合法拓扑序列,则输出YES;否则输出NO。
Example Input
1 0
2 2
1 2
2 1
Example Output
YES
NO
存在合法的拓扑序列==图中没有环
三个for循环,一个找入度为零的结点。一个将这个节点射出的边删除。这时,又会出现入度为零的边,再进行第三层循环。
给定一个有向图,判断该有向图是否存在一个合法的拓扑序列。
Input
输入包含多组,每组格式如下。
第一行包含两个整数n,m,分别代表该有向图的顶点数和边数。(n<=10)
后面m行每行两个整数a b,表示从a到b有一条有向边。
Output
若给定有向图存在合法拓扑序列,则输出YES;否则输出NO。
Example Input
1 0
2 2
1 2
2 1
Example Output
YES
NO
存在合法的拓扑序列==图中没有环
三个for循环,一个找入度为零的结点。一个将这个节点射出的边删除。这时,又会出现入度为零的边,再进行第三层循环。
//1、输入并用邻接矩阵保存点与点之间的关系,用数组保存每个点的入度。 //2、每次找一个入度为零的点,将所有和他相连的点的入度减一(删除相连的边)。 //3、重复步骤二,直到没有入度为零的点为止。 //4、如果这时还有入度不为零的点,证明有环,输出NO,反之输出YES。
#include <iostream> #include <cstring> using namespace std; int map[20][20]; int visit[20]; int ducount[20]; int main() { int n, m, a, b, i, flag, j, k; while(cin>>n>>m) { memset(map, 0, sizeof(map)); memset(visit, 0, sizeof(visit)); memset(ducount, 0, sizeof(ducount)); if(m == 0)//图中没有边,自然没有环,所以是合法的拓扑序列 { cout<<"YES"<<endl; } else { for(i = 0; i < m; i++) { cin>>a>>b; map[a][b] = 1; ducount[b]++;//记录每个顶点的入度 } for(i = 1; i <= n; i++)//遍历n次,只要还有结点就会进入 { flag = 0; for(j = 1; j<= n; j++)//每次遍历n个结点 { if(visit[j] == 0 && ducount[j] == 0)//结点没有被访问过且入度为0 { visit[j] = 1;//标记访问过 for(k = 1; k <= n; k++)//遍历n个结点看是否有跟j相连的 { if(map[j][k] == 1)//与入度为0的j结点相连 { ducount[k]--;//k的入度-1,就是删除与j相连的那条边 } } flag = 1; break;//直接去判断下次 } } } if(flag == 0)//仍有结点,但不是入度为0的。即图中还有环 cout<<"NO"<<endl; else cout<<"YES"<<endl; } } return 0; }
#include <iostream> #include <cstring> using namespace std; int map[1100][1100]; int visit[1100]; int in[110]; int n; void top() { int flag; for(int i = 1; i <= n; i++)//进去找n次点 { flag = 0; for(int j = 1; j <= n; j++) { if(in[j] == 0 && visit[j] != 1) { flag = 1; visit[j] = 1; for(int k = 1; k <= n; k++) { if(map[j][k] == 1) { in[k]--; } } break;//必须有break。只要找到一个相连的必须进行下一个点的查找,一共n个顶点 } } if(flag == 0) break; } if(flag == 0) cout<<"NO"<<endl; else cout<<"YES"<<endl; } int main() { int m, v, u; while(cin>>n>>m) { memset(map, 0, sizeof(map)); memset(visit, 0, sizeof(visit)); memset(in, 0, sizeof(in)); for(int i = 0; i < m; i++) { cin>>u>>v; map[u][v] = 1; in[v]++; } if(m == 0) cout<<"YES"<<endl; else top(); } return 0; }
相关文章推荐
- 数据结构实验之图论十:判断给定图是否存在合法拓扑序列---bfs判断又向图的无环问题
- 数据结构实验之图论十:判断给定图是否存在合法拓扑序列
- 数据结构实验之图论十:判断给定图是否存在合法拓扑序列
- 数据结构实验之图论十:判断给定图是否存在合法拓扑序列
- 数据结构实验之图论十:判断给定图是否存在合法拓扑序列
- 数据结构实验之图论十:判断给定图是否存在合法拓扑序列
- 数据结构实验之图论十:判断给定图是否存在合法拓扑序列
- 数据结构实验之图论十:判断给定图是否存在合法拓扑序列
- 数据结构实验之图论十:判断给定图是否存在合法拓扑序列
- SDUT 2140 图结构练习——判断给定图是否存在合法拓扑序列
- 图结构练习——判断给定图是否存在合法拓扑序列
- 图结构练习——判断给定图是否存在合法拓扑序列
- 2140-数据结构实验之图论十:判断给定图是否存在合法拓扑序列
- 图结构练习——判断给定图是否存在合法拓扑序列
- 图结构练习——判断给定图是否存在合法拓扑序列
- SDUT OJ 2140 图结构练习——判断给定图是否存在合法拓扑序列
- 图结构练习——判断给定图是否存在合法拓扑序列
- 图结构练习——判断给定图是否存在合法拓扑序列(拓扑排序判断环)
- 暑假集训 8.19 图结构练习——判断给定图是否存在合法拓扑序列 sdut2140
- 图结构练习——判断给定图是否存在合法拓扑序列(topo)