图结构练习——判断给定图是否存在合法拓扑序列
题目描述
给定一个有向图,判断该有向图是否存在一个合法的拓扑序列。
输入
输入包含多组,每组格式如下。
第一行包含两个整数n,m,分别代表该有向图的顶点数和边数。(n<=10)
后面m行每行两个整数a b,表示从a到b有一条有向边。
输出
若给定有向图存在合法拓扑序列,则输出YES;否则输出NO。
示例输入
1 0 2 2 1 2 2 1
示例输出
YES NO
#include <iostream> #include<stdio.h> #include<string.h> #include<stdlib.h> #include<math.h> #include<malloc.h> #include<stack> using namespace std; int map[11][11]; int n; int degree[11]; int topo() { int i,j,k,flag; for(i=1;i<=n;i++) { flag=0; for(j=1;j<=n;j++) { if(degree[j]==0) { degree[j]--; flag=1; for(k=1;k<=n;k++) { if(map[j][k]==1) degree[k]--; } break; } } if(flag==0) break; } if(flag==1) cout<<"YES"<<endl; else cout<<"NO"<<endl; } int main() { int m,a,b; while(scanf("%d%d",&n,&m)!=EOF) { memset(map,0,sizeof(map)); memset(degree,0,sizeof(degree)); for(int i=1;i<=m;i++) { cin>>a>>b; map[a][b]=1; degree[b]++; } topo(); } }