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

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

 

Time Limit: 1000MS Memory limit: 65536K

题目描述

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

输入

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

输出

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

示例输入

1 0
2 2
1 2
2 1

示例输出

YES
NO

提示

 

来源

 赵利强

示例程序

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

int map[20][20],ru[20];//ru数组记录顶点的入度,map数组记录有向图
void tuopu(int n)
{//拓扑判断
    int i,j,k;
    int flag;
    for(i=1;i<=n;i++)
    {
        flag=0;//标记变量,初始化为0,如果flag=0,表示不能正确进行拓扑排序
        for(j=1;j<=n;j++)
        {
            if(ru[j]==0)
            {
                flag=1;
                ru[j]--;
                for(k=1;k<=n;k++)
                    if(map[j][k]!=0)
                        ru[k]--;//如果顶点J与K之间有线相连,则取消
                break;
            }
        }
        if(flag==0)
        {
            printf("NO\n");
            return;
        }

    }
    printf("YES\n");

}
int main()
{
    int n,m,a,b;
    int i;
    while(~scanf("%d%d",&n,&m))
    {
        memset(map,0,sizeof(map));
        memset(ru,0,sizeof(ru));
        for(i=0;i<m;i++)
        {
            scanf("%d%d",&a,&b);
            map[a][b]=1;
            ru[b]++;
        }
        tuopu(n);
    }
    return 0;
}

 

posted @ 2014-11-29 17:25  夏迩  阅读(116)  评论(0)    收藏  举报