您的位置:首页 > 其它

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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐