图结构练习——判断给定图是否存在合法拓扑序列
图结构练习——判断给定图是否存在合法拓扑序列
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 <stdio.h> #include <stdlib.h> #include <string.h> int map[20][20],ru[20];//ru数组记录顶点的入度,map数组记录有向图 void tuopu(int n) {//拓扑判断 int i,j,k; int flag; for(i=1;i<=n;i++) { flag=0;//标记变量,初始化为0,如果flag=0,表示不能正确进行拓扑排序 for(j=1;j<=n;j++) { if(ru[j]==0) { flag=1; ru[j]--; for(k=1;k<=n;k++) if(map[j][k]!=0) ru[k]--;//如果顶点J与K之间有线相连,则取消 break; } } if(flag==0) { printf("NO\n"); return; } } printf("YES\n"); } int main() { int n,m,a,b; int i; while(~scanf("%d%d",&n,&m)) { memset(map,0,sizeof(map)); memset(ru,0,sizeof(ru)); for(i=0;i<m;i++) { scanf("%d%d",&a,&b); map[a][b]=1; ru[b]++; } tuopu(n); } return 0; }

浙公网安备 33010602011771号