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

来源:互联网 发布:董秘助手软件下载 编辑:程序博客网 时间:2024/06/10 09:30

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

Time Limit: 1000MS Memory limit: 65536K

题目描述

 给定一个有向图,判断该有向图是否存在一个合法的拓扑序列。

输入

 输入包含多组,每组格式如下。
第一行包含两个整数n,m,分别代表该有向图的顶点数和边数。(n<=10)
后面m行每行两个整数a b,表示从a到b有一条有向边。
 

输出

 若给定有向图存在合法拓扑序列,则输出YES;否则输出NO。
 

示例输入

1 02 21 22 1

示例输出

YESNO

提示

 

来源

 赵利强

示例程序

 

  • 提交 
  • 状态

 

#include <stdio.h>#include <stdlib.h>#include <string.h>#define MAX 100typedef 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;}


 

0 0
原创粉丝点击