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

来源:互联网 发布:张国荣歌曲我知你好 编辑:程序博客网 时间:2024/05/22 11:52

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

Time Limit: 1000MS Memory Limit: 65536KB
SubmitStatistic

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 <bits/stdc++.h>using namespace std;int a[1100][1100], vis[1100], du[1100];int m, n;void tupu(){    int flag;    for(int i = 1; i <= n; i++)//寻找n次,每次都找一个度为0切没有被访问过的节点依次寻找。    {        flag = 0;        for(int j = 1; j <= n; j++)//节点从1到n依次遍历寻找。        {            if(vis[j] == 0 && du[j] == 0)//找到一个度为0的节点,且没有被访问过。            {                vis[j] = 1;//将此节点标志位1.                for(int k = 1; k <= n; k++)//以此节点为起点的弧去掉。                {                    if(a[j][k] == 1)                    {                        du[k]--;                    }                }                flag = 1;                break;//结束这一次查找            }        }    }    if(flag == 1)//若每一次都可以找到度为0的节点则是拓扑排序。    {        cout << "YES" << endl;    }    else    {        cout << "NO" << endl;    }}int main(){    int i, j, x;    while(cin >> n >> m)    {        memset(a, 0, sizeof(a));        memset(vis, 0, sizeof(vis));        memset(du, 0, sizeof(du));        for(x = 0; x < m; x++)        {            cin >> i >> j;            a[i][j] = 1;            du[j]++;        }        tupu();    }    return 0;}
阅读全文
0 0
原创粉丝点击