首页 考试吧论坛 Exam8视线 考试商城 网络课程 模拟考试 考友录 实用文档 求职招聘 论文下载
2011中考 | 2011高考 | 2012考研 | 考研培训 | 在职研 | 自学考试 | 成人高考 | 法律硕士 | MBA考试
MPA考试 | 中科院
四六级 | 职称英语 | 商务英语 | 公共英语 | 托福 | 雅思 | 专四专八 | 口译笔译 | 博思 | GRE GMAT
新概念英语 | 成人英语三级 | 申硕英语 | 攻硕英语 | 职称日语 | 日语学习 | 法语 | 德语 | 韩语
计算机等级考试 | 软件水平考试 | 职称计算机 | 微软认证 | 思科认证 | Oracle认证 | Linux认证
华为认证 | Java认证
公务员 | 报关员 | 银行从业资格 | 证券从业资格 | 期货从业资格 | 司法考试 | 法律顾问 | 导游资格
报检员 | 教师资格 | 社会工作者 | 外销员 | 国际商务师 | 跟单员 | 单证员 | 物流师 | 价格鉴证师
人力资源 | 管理咨询师考试 | 秘书资格 | 心理咨询师考试 | 出版专业资格 | 广告师职业水平
驾驶员 | 网络编辑
卫生资格 | 执业医师 | 执业药师 | 执业护士
会计从业资格考试会计证) | 经济师 | 会计职称 | 注册会计师 | 审计师 | 注册税务师
注册资产评估师 | 高级会计师 | ACCA | 统计师 | 精算师 | 理财规划师 | 国际内审师
一级建造师 | 二级建造师 | 造价工程师 | 造价员 | 咨询工程师 | 监理工程师 | 安全工程师
质量工程师 | 物业管理师 | 招标师 | 结构工程师 | 建筑师 | 房地产估价师 | 土地估价师 | 岩土师
设备监理师 | 房地产经纪人 | 投资项目管理师 | 土地登记代理人 | 环境影响评价师 | 环保工程师
城市规划师 | 公路监理师 | 公路造价师 | 安全评价师 | 电气工程师 | 注册测绘师 | 注册计量师
缤纷校园 | 实用文档 | 英语学习 | 作文大全 | 求职招聘 | 论文下载 | 访谈 | 游戏
您现在的位置: 考试吧(Exam8.com) > 软件水平考试 > 复习资料 > 网络工程师 > 正文

网络工程师考点:图的深度及广度遍历

来源:PChome 2006-1-10 8:08:13 考试吧:中国教育培训第一门户 模拟考场
div id=content>

其中深度遍历利用递归函数
也可以用栈实现深度遍历,我觉得可以用递归的地方就可以用栈的,两种方法的运行顺序是一样的,但栈的效率更高些

广度遍历利用队列实现

在本程序中建立的图如下:
共有9个顶点,14条边为:
98,95,81,75,65,63,60,51,43,42,30,21,20,10
所以程序中建立图的数据为:
edges="988175656360514342 30212010";
createAMLGraph(G,10,13,edges);
Click to Open in New Window


运行结果:
可以看出深度遍历是沿着一条路探索到最深层,再回溯再换另一条路
而广度遍历利用队列的先进后出可以实现从里层开始一层一层的向外探索
Click to Open in New Window

以下是代码:
分为三部分:队列结构、图结构(多重表)、深度广度遍历


// 打印出每个顶点的邻接顶点
void PrintGraph(AMLGraph G){
  int t;
  EBox *p;
  cout<<"\nPrint All vex -------------------------\n\n";
  for(t=0;t    cout<    while(p!=NULL){
      if(t==p->ivex){
        cout<jvex<<" ";
        p=p->ilink;
      }else{
        cout<ivex<<" ";
        p=p->jlink;
      }
    }
    cout<<"\n";
  }
  cout<<"\nPrint All vex -------------------------\n\n";
}

// 返回图G中v顶点的第一个邻接顶点
int FirstAdjVex(AMLGraph &G,int v){
  if(G.adjlist[v].firstedge==NULL)
    return -1;
  if(v==G.adjlist[v].firstedge->ivex){
    return G.adjlist[v].firstedge->jvex;
  }else{
    return G.adjlist[v].firstedge->ivex;
  }
}

// 返回图G中v顶点中邻接顶点w接下来的邻接顶点
int NextAdjVex(AMLGraph &G,int v,int w){
  EBox *p;
  p=G.adjlist[v].firstedge;
  while(p!=NULL){
    if(v==p->ivex){
      if(w==p->jvex){
        if(p->ilink==NULL)
          return -1;
        return p->ilink->ivex==v?p->ilink->jvex:p->ilink->ivex;
      }else{
        p=p->ilink;
      }
    }else{
      if(w==p->ivex){
        if(p->jlink==NULL)
          return -1;
        return p->jlink->ivex==v?p->jlink->jvex:p->jlink->ivex;
      }else{
        p=p->jlink;
      }
    }
  }
  return -1;
}

深度广度遍历:

// ----------------------- 深度及广度优先遍历 -------------------------

// 对已经访问的顶点做标记
int visited[MAX_VERTEX_NUM];

// 深度优先遍历的递归函数DFS()
void DFS(AMLGraph &G,int v){
  int w;
  cout< ";
  visited[v]=TRUE;
  for(w=FirstAdjVex(G,v);w>=0;w=NextAdjVex(G,v,w)){
    if(visited[w]!=TRUE){
      DFS(G,w);
    }
  }
}

// 深度优先遍历图
void DFSTraverse(AMLGraph &G){
  int i;
  cout<<"\nDFSTraverse--------------------\n\n";
  for(i=0;i    visited[i]=FALSE;
  }
  for(i=0;i    if(!visited[i]){
      DFS(G,i);
      cout<<"NULL\n";
    }
  }
  cout<<"\nDFSTraverse--------------------\n\n";
}

// 广度优先遍历图
void BFSTraverse(AMLGraph &G){
  int v,w,i;
  LinkQueue Q;
  InitQueue(Q);
  cout<<"\nBFSTraverse--------------------\n\n";
  for(v=0;v    visited[v]=FALSE;
  }
  for(i=0;i    if(!visited[i]){
      visited[i]=TRUE;
      cout< ";
      EnQueue(Q,i);
      while(!QueueEmpty(Q)){
        DeQueue(Q,v);
        for(w=FirstAdjVex(G,v);w>=0;w=NextAdjVex(G,v,w)){
          if(!visited[w]){
            visited[w]=TRUE;
            cout< ";
            EnQueue(Q,w);
          }
        }
      }
      cout<<"NULL\n";
    }
  }
  cout<<"\nBFSTraverse--------------------\n\n";
}


void main(){
  AMLGraph G;
  char *edges;
  // 输入边序列,每条边的两个顶点依次输入
  edges="98817565636051434230212010";
  // 建立图,顶点数为10,边数为13,边序列为edges
  createAMLGraph(G,10,13,edges);
  PrintGraph(G);
  DFSTraverse(G);
  BFSTraverse(G);
}

上一页  1 2 3 4 5  下一页
文章搜索
软件水平考试栏目导航
版权声明:如果软件水平考试网所转载内容不慎侵犯了您的权益,请与我们联系800@exam8.com,我们将会及时处理。如转载本软件水平考试网内容,请注明出处。