数据结构实验之图论十:判断给定图是否存在合法拓扑序列
Time Limit: 1000 ms Memory Limit: 65536 KiB
Problem Description
给定一个有向图,判断该有向图是否存在一个合法的拓扑序列。
Input
输入包含多组,每组格式如下。
第一行包含两个整数n,m,分别代表该有向图的顶点数和边数。(n<=10)
后面m行每行两个整数a b,表示从a到b有一条有向边。
Output
若给定有向图存在合法拓扑序列,则输出YES;否则输出NO。
Sample Input
1 0 2 2 1 2 2 1
Sample Output
YES NO
提示:该题让你判断这个序列是否存在合法的拓扑序列,而拓扑序列是无环图,如果此图有环就输出NO。
代码实现如下(g++):
#include <bits/stdc++.h> using namespace std; int Map[110][110]; int ind[110]; int sum,n,m; void topu() { int c=0; queue<int>t; for(int i=1;i<=n;i++) { if(ind[i]==0)//如果该点入度为0,数据的开头入度必为0,将其入队 { t.push(i); c++; } } while(!t.empty()) { int s=t.front(); t.pop(); for(int i=1;i<=n;i++) { if(Map[s][i]==1) { ind[i]--; if(ind[i]==0)//判断有几个入度为1的,并计数,入队 { t.push(i); c++; } } } } if(c!=n)//最后判断计的数和结点数是否相同,就是判断是不是除了开头其他结点的入度都为1,就无环。 printf("NO "); else printf("YES "); } int main() { int a,b,i; while(~scanf("%d %d",&n,&m)) { memset(Map,0,sizeof(Map)); memset(ind,0,sizeof(ind)); for(i=0;i<m;i++) { scanf("%d %d",&a,&b); Map[a][b]=1; ind[b]++;//将b点入度加一 } topu(); } return 0; } /*************************************************** Result: Accepted Take time: 0ms Take Memory: 244KB ****************************************************/