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

来源:互联网 发布:sybase数据库建表语句 编辑:程序博客网 时间:2024/05/22 05:08

题目描述

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

输入

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

输出

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

示例输入

1 02 21 22 1

示例输出

YESNO
#include <iostream>#include <cstring>#include <cstdio>#include <algorithm>using namespace std;int map[15][15],vis[15],houzhui[15];int n,m;void goujian(){    int a,b,i;    memset(map,0,sizeof(map));    memset(vis,0,sizeof(vis));    memset(houzhui,0,sizeof(houzhui));    for(i=1; i<=m; i++)    {        scanf("%d %d",&a,&b);        if(m/p[a][b]==0)        {            map[a][b]=1;            houzhui[b]++;        }    }}void paixu(){    int i,f,k,j;    for(i=1; i<=n; i++)    {        f=0;        for(j=1; j<=n; j++)        {            if(vis[j]==0&&houzhui[j]==0)  //找出入度为0  则可说明合法边存在            {                vis[j]=1;                for(k=1; k<=n; k++)                {                    if(map[j][k]==1)                    {                        houzhui[k]--;       //将增加的度和存在的那条变减去。                    }                }                f=1;                break;            }        }        if(f==0)        {            break;        }    }    if(f==1)    {        printf("YES\n");    }    else printf("NO\n");}int main(){    while(scanf("%d %d",&n,&m)!=EOF)    {        goujian();        paixu();    }    return 0;}


0 0
原创粉丝点击