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

    xiaoxiao2026-03-15  6

    题目描述

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

    输入

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

    输出

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

    示例输入

    1 0 2 2 1 2 2 1

    示例输出

    YES NO

    提示

    <span style="font-size:14px;">#include<iostream> #include<cstdio> #include<cstring> using namespace std; int mp[15][15],vis[15]; int main() { int n,m; int flag,a,b; while(cin>>n>>m) { memset(mp,0,sizeof(mp)); memset(vis,0,sizeof(vis)); for(int i=0;i<m;i++) { cin>>a>>b; mp[a][b]=1; vis[b]++; } for(int i=1;i<=n;i++) { flag=0;//标记变量 for(int j=1;j<=n;j++) { if(vis[j]==0) { flag=1;//只要有入度为零的点就标记为一 vis[i]=-1;//避免以计算过入度为零的节点再次被计算,所以删除 for(int k=1;k<=n;k++) { if(mp[i][k])//如果mp的值不为零,则说明这两个节点相连 vis[k]--;//与该节点相连的节点入度减一 } break;//找到一个入度为零的点结束 } } if(flag==0)//如果节点未输出完,图中就没有了入度为零的节点,证明有环,则不合法 break; } if(flag==1) cout<<"YES"<<endl;//无环 else cout<<"NO"<<endl;//有环 } }</span><span style="color:#7ca9ed;font-size: 20px;"> </span>

    转载请注明原文地址: https://ju.6miu.com/read-1307991.html
    最新回复(0)