您的位置:首页 > 其它

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

2016-08-18 17:32 363 查看


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



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


提示

 

来源

 赵利强

示例程序

 

提交 
状态

 

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX 100
typedef struct
{
int *base;
int *top;
} sq;
typedef int Status;
typedef struct VNode
{
int data;
struct VNode *next;
}VNode;
typedef struct
{
int vexnum,arcnum;
VNode *vertices[MAX];
}ALGraph;
Status e,indgeree[MAX],n,m;
Status CreatUDG(ALGraph *G)
{
int i,v1,v2;
VNode *p;
G->vexnum=n;G->arcnum=m;
for(i=1;i<=G->vexnum;i++)
{
G->vertices[i]=(VNode *)malloc(sizeof(VNode));
G->vertices[i]->next=NULL;
}
for(i=1;i<=G->arcnum;i++)
{
scanf("%d%d",&v1,&v2);
p=(VNode *)malloc(sizeof(VNode));
p->data=v2;
p->next=G->vertices[v1]->next;
G->vertices[v1]->next=p;
}
return 1;
}
void FindInDgeree(ALGraph *G)
{
int i,k;
VNode *p;
for(i=1;i<=G->vexnum;i++)
{
for(p=G->vertices[i]->next;p;p=p->next)
{
k=p->data;
indgeree[k]++;
}
}
}
int InitStack(sq *s)
{
s->base=(int *)malloc(MAX*sizeof(int));
if(!s->base)exit(-1);
s->top=s->base;
return 1;
}
int Push(sq *s,int e)
{
*s->top++=e;
return 1;
}
int Pop(sq *s)
{

e=*--s->top;
return 1;
}
int StackEmpty(sq *s)
{
if(s->base==s->top)return 1;
else return 0;
}
Status TopologicalSort(ALGraph *G)
{
sq S;
int i,k;
VNode *p;
FindInDgeree(G);
InitStack(&S);
for(i=1;i<=G->vexnum;i++)
if(!indgeree[i])Push(&S,i);
int count=0;
while(!StackEmpty(&S))
{
Pop(&S);
count++;
for(p=G->vertices[e]->next;p;p=p->next)
{
k=p->data;
if(!(--indgeree[k]))Push(&S,k);
}
}
if(count<G->vexnum)printf("NO\n");
else printf("YES\n");
return 1;
}
int main()
{
ALGraph G;
while(scanf("%d%d",&n,&m)!=EOF)
{
memset(indgeree,0,sizeof(indgeree));
CreatUDG(&G);
TopologicalSort(&G);
}
return 0;
}


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