数据结构实验之图论十:判断给定图是否存在合法拓扑序列

来源:互联网 发布:大数据监控系统 编辑:程序博客网 时间:2024/06/05 09:27

Problem Description

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

Input

 输入包含多组,每组格式如下。

第一行包含两个整数n,m,分别代表该有向图的顶点数和边数。(n<=10)

后面m行每行两个整数a b,表示从a到b有一条有向边。

 

Output

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

 

Example Input

1 02 21 22 1

Example Output

YESNO
//若存在环路则不存在拓扑序列。//可以记录下每个点的入度,把入度为零的点逐一删去//若无环路。最后就不剩下点了#include <stdio.h>#include <string.h>int n, m;int map[15][15], book[15], dgree[15];//dgree记录每个点的入度int main(){    int count; //count记录点的个数    int i, j, u, v, k;    while(scanf("%d %d", &n, &m) != EOF)    {        count = n;        memset(map, 0, sizeof(map));        memset(book, 0, sizeof(book));        memset(dgree, 0, sizeof(dgree));        for(i = 0; i < m; i++)        {            scanf("%d %d", &u, &v);            map[u][v] = 1;            dgree[v]++;//记录入度        }        for(i = 1; i <= n; i++)  //寻找入度为零的点        {            for(j = 1; j <= n; j++)            {                if(!dgree[j] && !book[j])    //入度为零且未被访问过                {                    book[j] = 1;                    count--;    //count--说明删去了一个入度为零的点                    for(k = 1; k <= n; k++)   //和被删去的点存在联系的点的入度也发生了变化。遍历寻找,修改。                    {                        if(map[j][k])                            dgree[k]--;                    }                }            }        }        if(count)  //count不为零说明没有删除干净            printf("NO\n");        else            printf("YES\n");    }    return 0;}

阅读全文
0 0
原创粉丝点击