您的位置:首页 > 编程语言

图结构练习——判断给定图是否存在合法拓扑序列(dfs算法(第一个代码),邻接矩阵(前两个代码),邻接表(第三个代码))

2013-08-09 11:01 579 查看
sdut 2140

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

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

网上看到有人的思路很巧妙,忍不住就稍作修改,贴了上来:http://www.cnblogs.com/luyingfeng/archive/2013/07/29/3223090.html
第一种思路是直接判断环是否存在的思路,这种思路采用dfs算法,是非常规思路:


#include<stdio.h>
#include<string.h>
#include<stdlib.h>
struct vode
{
int v;
struct vode *next;
};
struct vode *f[300];
int m,n;
int rudu[300];
int stack[300],top;
void hs()
{
int i,k=0;
while(k=!k)
for(i=1;i<=m;i++)
if(rudu[i]==0)
{
k=0;
rudu[i]--;
stack[top++]=i;
struct vode *p;
for(p=f[i];p!=NULL;p=p->next)
rudu[p->v]--;
break;
}
}
int main()
{
while(scanf("%d%d",&m,&n)!=EOF)
{
memset(f,0,sizeof(f));
memset(rudu,0,sizeof(rudu));
memset(stack,0,sizeof(stack));
top=0;
int i;
for(i=1;i<=n;i++)
{
int u,v;
scanf("%d%d",&u,&v);
rudu[v]++;
struct vode *p;
p=(struct vode *)malloc(sizeof(struct vode));
p->v=v;
p->next=f[u];
f[u]=p;
}
hs();
/*//下面的循环可以显示出拓扑序列
for(i=0;i<=top-1;i++)
printf("%d ",stack[i]);
printf("\n");
*/
if(top==m)printf("YES\n");
else printf("NO\n");
}
return 0;
}


View Code

测试数据:

5 4

1 3

2 3

3 4

3 5

输出:

YES

-1 -1 -1 -1 -1

1 2 3 4 5

测试连接:http://wenku.baidu.com/view/bb32ee2e4b73f242336c5f53.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: