user-0 提问: 急求解假设以邻接矩阵作为图的存储结构，编写算法，判别在给定的有向图中是否存在一个简单的有向回路，若存在，则以顶点序列的方式输出该回路（找到一条即可）（注：图中不

回复:
user: user-0
content: for(int i=0;i<n;i++) if(G[u][i]&&i!=fa){         if(vis[i]<0) { cycle =u;return false;}这个呢         if(!dfs(i,u)) return false; 这个是什么意思     }     vis[u] =1; 1和-1代表什么意思，尽量给解释下具体的思想 快，我要结算帖子了

user: user-0
content: 楼上的好像有问题啊，请再试试 #include<iostream.h> #include<stdlib.h> #include<stdio.h> #include<string.h> #include<conio.h> const int N=100; bool G[N][N]; int path[N], vis[N],n,cycle; bool dfs(int u,int fa) {     vis[u] =-1;     path[u] =fa;     for(int i=0;i<n;i++) if(G[u][i]&&i!=fa){         if(vis[i]<0) { cycle =u;return false;}         if(!dfs(i,u)) return false;     }     vis[u] =1;     return true; } void showpath(int u){     if(u<0) return;     showpath(path[u]);     cout<<' '<<u; } int main() { 	scanf("%d" ,  &n) ;     memset(G , 0 , sizeof(G)) ;     for(int i = 1;i <= n;i++) 	{ 		for(int j = 1;j <= n;j++) 		{ 			scanf("%d" , &G[i][j]) ; 		}     }          cycle =-1;         for( i=0;i<n;i++)  			if(!vis[i]&&!dfs(i,-1)) 				break;         if(cycle<0) 			cout<<"no cycle\n";         else 		{             cout<<"find cycle\n";             showpath(cycle);             cout<<endl;         }     return 0; } 这个程序咋回事，感觉还是有问题，结果不对

user: user-0
content: 应该是明明这个存在环的

user: user-1
content: const int N=100; bool G[N][N]; int path[N], vis[N],n,cycle; bool dfs(int u,int fa) {     vis[u] =-1;     path[u] =fa;     for(int i=0;i<n;i++) if(G[u][i]&&i!=fa){         if(vis[i]<0) { cycle =u;return false;}         if(!dfs(i,u)) return false;     }     vis[u] =1;     return true; } void showpath(int u){     if(u<0) return;     showpath(path[u]);     cout<<' '<<u; } int main(){          while(cin>>n&&n){         memset(vis,0,sizeof vis);         for(int i=0;i<n;i++) for(int j=0;j<n;j++)             cin>>G[i][j];         cycle =-1;         for(int i=0;i<n;i++) if(!vis[i]&&!dfs(i,-1)) break;         if(cycle<0) cout<<"no cycle\n";         else{             cout<<"find cycle\n";             showpath(cycle);             cout<<endl;         }     }     return 0; }

user: user-0
content: 哦，具体是怎么解释啊，算法思想是什么呢，能简单说下吗

user: user-1
content: 你改了我的代码, 我的结点是从0开始的, 你在读G的时候变成了1开始

user: user-0
content: 楼上的程序还是有问题吧，判断是否有环存在啊，怎么不行啊

user: user-0
content: 这么猛楼上，我试试行不行啊

user: user-2
content: #include<cstdio> #include<cstring> #include<iostream> using namespace std ; const int maxn = 1010 ; int map[maxn][maxn] ; int vis[maxn] ; int n  ; bool dfs(int u , int &x){     if(vis[u]){         x = u ;         printf("%d\n" , u) ;         return true  ;     }     vis[u] = 1 ;     for(int i = 1;i <= n;i++){         if(map[u][i]){             if(dfs(i , x)){                 if(x && x != u){                     printf("%d\n" , u) ;                 }                 else if(x == u){                      printf("%d\n" , u) ;                      x = 0 ;                 }                 return true  ;             }         }     }     return false ; } int main() {     scanf("%d" ,  &n) ;     memset(map , 0 , sizeof(map)) ;     for(int i = 1;i <= n;i++){          for(int j = 1;j <= n;j++){              scanf("%d" , &map[i][j]) ;          }     }     memset(vis , 0 , sizeof(vis)) ;     bool flag = false ;     for(int i = 1;i <= n;i++){         int x = 0 ;         if(!vis[i]){              if(dfs(i,x)){                  flag = true ;                  break ;              }         }     }     if(!flag){         puts("NO") ;     } }

user: user-1
content: 直接DFS搜一下不行吗

user: user-0
content: 急求，大牛帮忙