SDUT2104图结构练习——判断给定图是否存在合法拓扑序列
2016-08-18 19:51
260 查看
图结构练习——判断给定图是否存在合法拓扑序列
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
提示
什么是拓扑排序呢?简单的来说就是有向不循环图。
要记录的是每个节点的入度in[i];如果看代码有点难理解,可以画个图顺一遍就可以了
来源
赵利强
示例程序
#include <stdio.h> #include <string.h> int in[150000],map[1000][1000]; int main() { int n,m,i,u,v,j,k,f; while(~scanf("%d%d",&n,&m)) { memset(map,0,sizeof(map)); memset(in,0,sizeof(in)); for(i=0; i<m; i++) { scanf("%d%d",&u,&v); map[u][v]=1; in[v]++; } for(i=1; i<=n; i++) { f=0;//标记变量 for(j=1; j<=n; j++) { if(in[j]==0)//说明这是一个相当有根的一个节点;如果有循环,i一定不在里边 { in[j]--;//所以要把它删了; f=1; for(k=1; k<=n; k++)//把他指向的节点的入度也减一; { if(map[j][k]) { in[k]--; } } break;//找到一个结束就可以了,从头再找,防止连着找错了; } }//每次循环都会有一个节点的入度被删为0; if(f==0) break;//说明第二个for完成了,但没找到有0入度的节点,只有一种可能,存在环; } if(f==0) printf("NO\n"); else printf("YES\n"); } return 0; }
相关文章推荐
- 图结构练习——判断给定图是否存在合法拓扑序列 SDUT 2140
- SDUT2140图结构练习——判断给定图是否存在合法拓扑序列
- sdut 图结构练习——判断给定图是否存在合法拓扑序列
- SDUT 图结构练习——判断给定图是否存在合法拓扑序列
- SDUT2140图结构练习——判断给定图是否存在合法拓扑序列
- SDUT 2140 图结构练习——判断给定图是否存在合法拓扑序列
- SDUT2140_图结构练习——判断给定图是否存在合法拓扑序列(邻接表)
- SDUT 图结构练习——判断给定图是否存在合法拓扑序列
- 暑假集训 8.19 图结构练习——判断给定图是否存在合法拓扑序列 sdut2140
- SDUT 2140 图结构练习——判断给定图是否存在合法拓扑序列
- [SDUT](2140)图结构练习——判断给定图是否存在合法拓扑序列 ---拓扑排序(图)
- 图结构练习——判断给定图是否存在合法拓扑序列
- SDUT OJ 2140 图结构练习——判断给定图是否存在合法拓扑序列
- 图结构练习——判断给定图是否存在合法拓扑序列
- 图结构练习——判断给定图是否存在合法拓扑序列
- 图结构练习——判断给定图是否存在合法拓扑序列
- 图结构练习——判断给定图是否存在合法拓扑序列
- 图结构练习——判断给定图是否存在合法拓扑序列
- 图结构练习——判断给定图是否存在合法拓扑序列
- 图结构练习——判断给定图是否存在合法拓扑序列