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

来源:互联网 发布:cf咪咕刷枪软件 编辑:程序博客网 时间:2024/06/03 20:27

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

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<bits/stdc++.h>using namespace std;int bfs[20][20];bool visit[20];int du[30];int main(){    int n,m,i,j,k;    int u,v;    while(cin>>n>>m&&n)    {        int cut=n;        memset(bfs,0,sizeof(bfs));        memset(visit,false,sizeof(visit));        memset(du,0,sizeof(du));        while(m--)        {            cin>>u>>v;            bfs[u][v]=1;            du[v]++;        }        for(i=1;i<=n;i++)///遍历所有的点        {            for(j=1;j<=n;j++)///寻找入度为0的点            {                if(du[j]==0&&visit[j]!=true)                {                    visit[j]=true;                    cut--;                    for(k=1;k<=n;k++)                    {                        if(bfs[j][k]==1)                        {                            du[k]--;///与这个删掉的入度为0的点相关的入度删掉                        }                    }                        break;                }            }        }        if(cut==0)        {            cout<<"YES"<<endl;        }        else        {            cout<<"NO"<<endl;        }    }    return 0;}


阅读全文
0 0
原创粉丝点击