http://acm.sdut.edu.cn/sdutoj/showproblem.php?pid=2140&cid=1186
就是判断图中是否存在有向环,如果存在,则不是拓扑排序。
1.借助dfs函数判断是否存在环
#include<stdio.h> #include<stdio.h> #include<string.h> #include<stdlib.h> #define maxn 11 int G[maxn][maxn],vis[maxn],n; int DFS(int u) { vis[u]=-1;//正在访问 for(int v=1; v<=n; v++) if(G[u][v]) { if(vis[v]<0)//判断是否有环 return 0; if(!vis[v] && !DFS(v)) return 0; } vis[u]=1;//已访问过 return 1; } int toposort() { for(int u=1; u<=n; u++) if(!vis[u] && !DFS(u)) return 0; return 1; } int main() { int m,u,v; while(~scanf("%d%d",&n,&m) && n+m!=0) { memset(G,0,sizeof(G)); memset(vis,0,sizeof(vis)); for(int i=0; i<m; i++) { scanf("%d%d",&u,&v); G[u][v]=1; } if(toposort()) printf("YES "); else printf("NO "); } return 0; }
2.根据是否有前驱点判断是否寻在环
#include<stdio.h> #include<string.h> #include<stdlib.h> #define maxn 11 int G[maxn][maxn],vis[maxn],n; int main() { int m,u,v; while(~scanf("%d%d",&n,&m) && n+m!=0) { int bug=0; memset(G,0,sizeof(G)); memset(vis,0,sizeof(vis)); for(int i=0; i<m; i++) { scanf("%d%d",&u,&v); G[u][v]=1; vis[v]++;//入度 } for(int i=0; i<n; i++)//总控 { int flag=0; for(u=1; u<=n; u++) if(vis[u]==0) { flag=1; vis[u]--;//已被访问标记(该值为-1) for(v=1; v<=n; v++) if(G[u][v]) vis[v]--;//将关联的顶点的入读减1 break; } if(!flag)//存在环 { bug=1; break; } } if(bug) printf("NO "); else printf("YES "); } return 0; }