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

来源:互联网 发布:淘宝助理最新版 编辑:程序博客网 时间:2024/05/17 14:29

题目描述

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

输入

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

输出

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

示例输入

1 02 21 22 1

示例输出

YESNO

提示

#include <iostream>
#include <cstdio>
#include <queue>
#include <cstring>
using namespace std;
int mp[20][20],in[20];
int main()
{
    int n,m,a,b,i,j,num;
    while(~scanf("%d%d",&n,&m))
    {   queue<int>q;
        num=0;
        memset(mp,0,sizeof(mp));
        memset(in,0,sizeof(in));
        for(i=1;i<=m;i++)
        {
            scanf("%d%d",&a,&b);
            mp[a][b]=1;
            in[b]++;
        }
        for(i=1;i<=n;i++)
        {
           if(in[i]==0)
           {
             q.push(i);
           }
        }
        while(!q.empty())
        {
           int x=q.front();
           q.pop();//把入度为0的点依次删除,不存在环的话所有的点就都被删除了
           num++;
           for(i=1;i<=n;i++)
           {
               if(mp[x][i])
               {
                  in[i]--;
                  if(in[i]==0)
                    q.push(i);
               }
           }
        }
        if(num==n)
            printf("YES\n");
        else printf("NO\n");

    }
    return 0;
}

 

0 0
原创粉丝点击