您的位置:首页 > 理论基础 > 数据结构算法

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

2017-12-12 09:33 274 查看

Problem Description

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

Input

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

Output

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

Example Input

1 0
2 2
1 2
2 1

Example Output

YES
NO
思路:先找到一个入度为0的点,遍历,并将该点所指向的所有的点的入度减一,继续找下一个入度为0的点,直到遍历完所有的点。
代码:
#include <bits/stdc++.h>#define inf 0x3f3f3f3fusing namespace std;int dis[1001][1001], v[1001], du[1001];int main(){    int n, m, a, b, i, j, flag;    while(~scanf("%d", &n))    {        scanf("%d", &m);        if(m==0)        {            printf("YES\n");            continue;        }        memset(du, 0, sizeof(du));        memset(dis, 0, sizeof(dis));        memset(v, 0, sizeof(v));        while(m--)        {            scanf("%d %d", &a, &b);            dis[a][b]=1;            du[b]++;        }        for(i=1; i<=n; i++)        {            flag=0;            for(j=1; j<=n; j++)            {                if(v[j]!=1&&du[j]==0)                {                    for(int k=1; k<=n; k++)                    {                        if(dis[j][k]==1)                        {                            du[k]--;                        }                    }                    v[j]=1;                    flag=1;                    break;                }            }            if(flag==0)                break;        }        if(flag)        printf("YES\n");        else        printf("NO\n");    }    return 0;}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  数据结构 语言 遍历
相关文章推荐