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

来源:互联网 发布:js奇偶数判断的代码 编辑:程序博客网 时间:2024/05/22 05:14

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

code:

#include <stdio.h>
#include <string.h>


int map[16][16];
int visit[16];
int in[16];//表示某点入度的数量;
int n, m;


void toport()
{
    int flag;
    for(int i = 1;i<=n;i++)//遍历每一个节点的入度与后继;
    {
        flag = 0;
        for(int j = 1;j<=n;j++)
        {
            if(!visit[j]&&!in[j])//该点没有走过并且入度为0,以此为起点;
            {
                visit[j] = 1;
                for(int k = 1;k<=n;k++)//以此点为前驱的所有后继失去一个前驱,以此循环,直到将入度为0的点全部读完;
                {
                    if(map[j][k])
                    {
                        in[k]--;
                    }
                }
                flag = 1;//若还剩下入度不为0的,说明有部分是成环的,直接跳出有环的不为拓扑
                break;
            }
        }
    }
    if(flag == 0) printf("NO\n");
    else printf("YES\n");
}
int main()
{
    while(~scanf("%d%d", &n, &m))
    {
        if(m == 0) 
        {
            printf("YES\n");
            continue;
        }
        memset(map, 0, sizeof(map));
        memset(visit, 0, sizeof(visit));
        memset(in, 0, sizeof(in));
        while(m--)
        {
            int a, b;
            scanf("%d%d", &a, &b);
            map[a][b] = 1;
            in[b]++;
        }
        toport();
    }
}

阅读全文
0 0