图结构练习——判断给定图是否存在合法拓扑序列
Time Limit: 1000ms Memory limit: 65536K 有疑问?点这里^_^
题目描述
给定一个有向图,判断该有向图是否存在一个合法的拓扑序列。
输入
输入包含多组,每组格式如下。
第一行包含两个整数n,m,分别代表该有向图的顶点数和边数。(n<=10)
后面m行每行两个整数a b,表示从a到b有一条有向边。
输出
若给定有向图存在合法拓扑序列,则输出YES;否则输出NO。
示例输入
1 0 2 2 1 2 2 1
示例输出
YES NO
#include<bits/stdc++.h> using namespace std; int Map[15][15]; int du[15]; int main() { int n,m,num; while(cin>>n>>m) { memset(Map,0,sizeof(Map)); memset(du,0,sizeof(du)); num=0; for(int i=0;i<m;i++) { int x,y; cin>>x>>y; Map[x][y]=1; du[y]++; } for(int i=0;i<n;i++) { for(int j=1;j<=n;j++) { if(du[j]==0) //找到每个入度为0的点 { num++; du[j]--; for(int k=1;k<=n;k++) { if(Map[j][k]) { Map[j][k]=0; du[k]--;// 删掉相关的边 } } break; } } } if(num==n)printf("YES\n"); else printf("NO\n"); } }