您的位置:首页 > 其它

图结构练习——判断给定图是否存在合法拓扑序列

2015-08-14 09:58 330 查看


图结构练习——判断给定图是否存在合法拓扑序列




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


提示

来源

赵利强

示例程序

view
plaincopyprint如果您复制代码时出现行号,请点击左边的“view
plain”后再复制

#include<stdio.h>

#include<string.h>

int n, m;

int map[20][20];

int in[20];

void tp()

{

int k, f;

for(int i=1;i<=n;i++)

{

f=0;

for(int j=1;j<=n;j++)

{

if(in[j]==0)

{

f=1;///只要有入度为零的点就变成一

in[j]=-1;///删除这个节点

for(int k=1;k<=n;k++)///找与该节点相连的节点

{

if(map[j][k])///如果map的值不为零,说明这两个节点相连

in[k]--;///与该节点相连的节点的入度减一

}

break;///找到一个入度为零的就结束

}

}

if(f==0)///如果结点未输出完,图中就没有了入度为零的结点,证明有环,则不合法

break;

}

if(f==1)

printf("YES\n");

else

printf("NO\n");

}

int main()

{

int u, v;

while(~scanf("%d%d", &n, &m))

{

memset(map,0,sizeof(map));

memset(in,0,sizeof(in));

while(m--)

{

scanf("%d%d", &u, &v);

map[u][v]=1;

in[v]++;

}

tp();

}

return 0;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: