Problem Description
给定一个有向图,判断该有向图是否存在一个合法的拓扑序列。
Input
输入包含多组,每组格式如下。
第一行包含两个整数n,m,分别代表该有向图的顶点数和边数。(n<=10)
后面m行每行两个整数a b,表示从a到b有一条有向边。
Output
若给定有向图存在合法拓扑序列,则输出YES;否则输出NO。
Example Input
1 0 2 2 1 2 2 1
Example Output
YES NO
思路:先找到一个入度为0的点,遍历,并将该点所指向的所有的点的入度减一,继续找下一个入度为0的点,直到遍历完所有的点。
代码:
#include <bits/stdc++.h> #define inf 0x3f3f3f3f using namespace std; int dis[1001][1001], v[1001], du[1001]; int main() { int n, m, a, b, i, j, flag; while(~scanf("%d", &n)) { scanf("%d", &m); if(m==0) { printf("YES\n"); continue; } memset(du, 0, sizeof(du)); memset(dis, 0, sizeof(dis)); memset(v, 0, sizeof(v)); while(m--) { scanf("%d %d", &a, &b); dis[a][b]=1; du[b]++; } for(i=1; i<=n; i++) { flag=0; for(j=1; j<=n; j++) { if(v[j]!=1&&du[j]==0) { for(int k=1; k<=n; k++) { if(dis[j][k]==1) { du[k]--; } } v[j]=1; flag=1; break; } } if(flag==0) break; } if(flag) printf("YES\n"); else printf("NO\n"); } return 0; }