数据结构实验之图论十:判断给定图是否存在合法拓扑序列

Time Limit: 1000 ms Memory Limit: 65536 KiB

Problem Description

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

Input

输入包含多组,每组格式如下。

第一行包含两个整数n,m,分别代表该有向图的顶点数和边数。(n<=10)

后面m行每行两个整数a b,表示从a到b有一条有向边。

Output

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

Sample Input

1 0

2 2

1 2

2 1

Sample Output

YES

NO

题解:判断拓扑序列可以每次把入度为0的点以及跟他有关的边去掉,最后看看是否能把所有的点去掉。

#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <math.h> int n;/*n节点数量*/
int f[1050];/*记录点是否被遍历过*/
int INF = 1e9+7;/*相当于无穷大*/
int s[1050][1050];
int c[1050],r[1050];/*记录节点的出度,入度*/ int main()
{
int m,i,j,num;
while(scanf("%d%d",&n,&m)!=EOF)
{
num = 0;
for(i=1;i<=n;i++)
{
c[i] = r[i] = 0;
f[i] = 0;
for(j=1;j<=n;j++)
s[i][j] = 0;
}
for(i=1;i<=m;i++)
{
int a,b;
scanf("%d%d",&a,&b);
c[a]++;
r[b]++;
s[a][b] = 1;
}
for(int l=0;l<n;l++)
{
for(i=1;i<=n;i++)
{
if(!f[i]&&r[i]==0)/*点的入度为0且没有被遍历过,标记并且遍历与他有关的边,删除*/
{
f[i] = 1;
for(j=1;j<=n;j++)
{
if(s[i][j])
r[j]--;
}
num++;
break;
}
}
}
if(num==n)
printf("YES\n");
else
printf("NO\n");
}
return 0;
}

最新文章

  1. .net 用户控件ascx.cs注册js脚本代码无效果
  2. iOS 获取UIView 动画的实时位置的方法
  3. Java文件操作与输入输出流
  4. fenghuangscannerV3 EXE版本
  5. Java基础之读文件——使用缓冲读取器读取文件(ReaderInputFromFile)
  6. SQL SERVER: 合并相关操作(Union,Except,Intersect) - 转载
  7. 顺序表及其多种实现方式 --- C/C++
  8. 打印1到最大的n位数
  9. 将Altium中的原理图与PCB导出为PDF的步骤与方法
  10. 给一组a标签当前页a标签加class
  11. Delphi使用Zint生成QR二维条码(zint.dll)
  12. iOS 跑马灯带图片可点击
  13. Installshield创建快捷方式不能正常运行的几种原因
  14. Servlet学习记录3
  15. angularJs中怎么模拟jQuery中的this?
  16. 存储-实例-ibm v3700
  17. 无法清除cookie中的属性值之对解决问题的思考
  18. idea导入myeclipes项目、运行项目
  19. Git如何获得两个版本间所有变更的文件列表
  20. shell 中的操作符

热门文章

  1. dubbo入门学习(五)-----dubbo的高可用
  2. 转:fork()子进程创建
  3. HttpComponents了解
  4. js前台中获取后台传的值
  5. IO流 输入和输出文档内容
  6. Python - 基本数据类型及其常用的方法之字典和布尔值
  7. Pandas怎样按条件删除行?
  8. 分享一个百度大牛的Python视频系列下载
  9. c/c++ explicit用法
  10. 【vue】/vue-ele-project