DFS法寻找:
首先创建一个数组G,保存每个连通线,然后进行拓扑排序,拓扑排序中需要创建一个数组判断是否有前驱,以及是否形成了有向环,如果形成有向环就不能进行拓扑排序,然后通过DFS查找前驱,同时查找的过程中不能出现正在递归的变量,如果出现便说明有有向环,递归结束之后把判断数组标记为已递归,然后把变量存入答案数组中。
#include<cstdio> #include<cstring> const int maxn=1002; int G[maxn][maxn],n,t,c[maxn],m,topo[maxn]; bool dfs(int u) { c[u]=-1;///标记,正在递归 for(int v=1; v<=n; v++) if(G[u][v]) { if(c[v]<0) return false;///如果出现在递归中的情况,说明前驱连通的有重复现象 else if(!c[v]) dfs(v);///当没有访问过时,递归查找前驱 } c[u]=1;///递归完毕,标记为1 topo[t--]=u;///每次递归的终点放入数组中,由于每次都是本次递归中最大的一部分,所以放在最后 return true; } bool toposort() { t=n; memset(c,0,sizeof(c)); for(int u=1; u<=n; u++) if(!c[u]) if(!dfs(u)) return false;///判断节点前面是否有前驱 return true; } int main() { while(~scanf("%d%d",&n,&m)&&n) { memset(G,0,sizeof(G)); for(int i=0; i<m; i++) { int u,v; scanf("%d%d",&u,&v); G[u][v]=1;///G数组判断是否连通 } if(toposort()) { for(int i=1; i<n; i++) printf("%d ",topo[i]); printf("%d\n",topo[n]); } else printf("No\n"); } return 0; }
浙公网安备 33010602011771号