CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
不看会后悔的Windows XP之经验谈 简单快捷DIY实用家庭影院
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  C/C++ >  C语言

深度优先搜索

楼主cih103()2005-06-03 21:53:21 在 C/C++ / C语言 提问

#include   <stdio.h>  
  #include   <stdlib.h>  
  #define   N   30  
     
  typedef   struct   node  
  {  
                    int   vno;  
                    struct   node   *next;  
  }edgeNode;  
     
  typedef   edgeNode*   Graph[N];  
     
  int   Create_list(Graph   g)  
  {  
                    int   vn,en,k,i,j;  
                    edgeNode   *p;  
     
                    printf("输入顶点数:\n");  
                    scanf("%d",&vn);  
                    printf("输入边数:\n");  
                    scanf("%d",&en);  
     
                    for(k=0;k<vn;k++)  
                                    g[k]=NULL;  
                    for(k=0;k<en;k++)  
                    {  
                                    printf("输入边:");  
                                    scanf("%d%d",&i,&j);  
     
                                    p=(edgeNode*)malloc(sizeof(edgeNode));  
                                    p->vno=j;  
                                    p->next=g[i];  
                                    g[i]=p;  
     
                                    p=(edgeNode*)malloc(sizeof(edgeNode));  
                                    p->vno=i;  
                                    p->next=g[j];  
                                    g[j]=p;  
                    }  
                    return   vn;  
  }  
     
  int   visited[N];  
  void   dfs(Graph   g,int   i)  
  {  
                    edgeNode   *t;  
                    printf("%4d",i);  
                    visited[i]=1;  
                    t=g[i];  
                    while(t!=NULL)  
                    {  
                                    if(visited[t->vno]==0)  
                                                      dfs(g,t->vno);  
                                    t=t->next;  
                    }  
  }  
     
  void   main()  
  {  
                    Graph   g;  
                    Create_list(g);  
                    dfs(g,0);  
  }  
     
  人家的程序,实现无向图的深度优先搜索,但我看不明白:p->next=g[i];  
                                    g[i]=p;  
  这两句是什么意思?还有它的输入是怎样的,为什么我输入老是O,郁闷死了,都怪水平太低了,见笑了  
     
   
  问题点数:0、回复次数:4Top

1 楼ptxyzgb(小三)回复于 2005-06-04 01:20:36 得分 0

p->next=g[i];  
  g[i]=p;  
  这两个语句的目的是为建立图的邻接链表。  
  输出都是0肯定是你在输入图的顶点不是从0开始。你把顶头从0开始试一下  
  Top

2 楼nasi00(莫傲·逍遥)回复于 2005-06-04 02:34:08 得分 0

其实用邻接矩阵存的深度优先是很简单的  
   
  void   dfs(int   v)  
  {  
        visit[v]=1;  
        for(int   i=0;i<vn;i++)  
            if(g[v][i]   &&   !visit[i])   {  
                  dfs(i);  
            }  
  }  
   
  这样就可以dfs一个图了,比如dfs(0),就是从v0开始dfs整个图  
   
  如果该图是不连通的,还可以通过  
   
  void   solve()  
  {  
          int   c=0,i;  
          for(i=0;i<vn;i++)  
                if(!visit[i])   {   dfs(i);   c++;   }  
  }  
   
  这样算完,c就是连通子集的个数了  
   
  其中vn为节点数,g[][]为邻接矩阵,visit[]为标记是否访问过  
   
  其实dfs,bfs都是最基础的东东了Top

3 楼WoodJohn(天在下雨,云在哭泣)回复于 2005-06-04 08:38:14 得分 0

这种建立邻接矩阵的方式很巧妙,算是温习了一下^_^。有几个地方你要注意哦:  
  1.在scanf后加上assert(i<vn&&j<vn),要不会出现非法访问内存错误  
  2.visited的元素虽然自动初始化为0,但还是手动初始化为好  
  3.忘了free?Top

4 楼WoodJohn(天在下雨,云在哭泣)回复于 2005-06-04 09:20:51 得分 0

错了,是邻接链表,不是矩阵  
  每找到一个邻接的节点,把它加到链表的最前面Top

相关问题

  • 找个深度/广度优先搜索的例子
  • 请问用delphi如何对表项进行移进归约(深度优先搜索法)???
  • 关于深度优先算法
  • 大家觉得<<delphi深度搜索>>一书怎么样?
  • 求电子版的<<深度搜索C++对象模型>>
  • 500分求深度优先和宽度优先算法~
  • 500分求深度优先和宽度优先算法~
  • 【求助】深度优先和广度优先的优缺点
  • 一个简单的深度搜索问题!急!各位帮帮忙!
  • 用深度搜索求欧拉回路超时,有什么好方法吗?

关键词

  • edgenode
  • vno
  • 深度优先
  • 输入
  • vn
  • graph
  • dfs
  • visit
  • next
  • 图

得分解答快速导航

  • 帖主:cih103

相关链接

  • C/C++ Blog
  • C/C++类图书
  • C/C++类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo