SDUT-2140_判断给定图是否存在合法拓扑序列
2024-09-08 04:46:27
数据结构实验之图论十:判断给定图是否存在合法拓扑序列
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;
}
最新文章
- .net 用户控件ascx.cs注册js脚本代码无效果
- iOS 获取UIView 动画的实时位置的方法
- Java文件操作与输入输出流
- fenghuangscannerV3 EXE版本
- Java基础之读文件——使用缓冲读取器读取文件(ReaderInputFromFile)
- SQL SERVER: 合并相关操作(Union,Except,Intersect) - 转载
- 顺序表及其多种实现方式 --- C/C++
- 打印1到最大的n位数
- 将Altium中的原理图与PCB导出为PDF的步骤与方法
- 给一组a标签当前页a标签加class
- Delphi使用Zint生成QR二维条码(zint.dll)
- iOS 跑马灯带图片可点击
- Installshield创建快捷方式不能正常运行的几种原因
- Servlet学习记录3
- angularJs中怎么模拟jQuery中的this?
- 存储-实例-ibm v3700
- 无法清除cookie中的属性值之对解决问题的思考
- idea导入myeclipes项目、运行项目
- Git如何获得两个版本间所有变更的文件列表
- shell 中的操作符