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

来源:互联网 发布:微信一秒语音制作软件 编辑:程序博客网 时间:2024/05/22 16:55

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

Time Limit: 1000MS Memory Limit: 65536KB
Submit Statistic

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
这个题目没有要求我们求拓扑排序的序列,只是判断有没有环的结构,所以我们只需要遍历一遍一次删掉入度为0的节点,当然不要忘记这时候会对与它相连的节点有影响,依次进行,如果最后没有节点则不存在环,有一个合法的拓扑排序序列,否则就存在环的结构。
#include <iostream>#include <string.h>using namespace std;int gra[15][15], du[15];         //标记节点的度bool visit[15];int main(){    int n, m;    int u, v;    int cnt;    while(cin>>n>>m && n){        cnt = n;                                             //记录节点数        memset(gra, 0, sizeof(gra));        memset(visit, false, sizeof(visit));        memset(du, 0, sizeof(du));        while(m--){            cin>>u>>v;            gra[u][v] = 1;            du[v]++;        }        for(int i = 1; i <= n; i++){                    //进行n次寻找            for(int j = 1; j <= n; j++){                                if(du[j] == 0&& visit[j] == 0){          //先找到一个度为0的节点                    visit[j] = true;                                cnt--;                               //每找到一个度为0的节点cnt-1                    for(int k = 1; k <= n; k++){                        if(gra[j][k])                            du[k]--;                    }                    break;                }            }        }        if(cnt)                                           //如果cnt的值为0说明所有的节点都已经被录入到拓扑序列中,否则就还存在度不是            cout<<"NO"<<endl;                             //0的节点,那么就存在环的结构        else            cout<<"YES"<<endl;    }}



阅读全文
0 0