扫码加入训练营

牢记核心词

学习得礼盒

计算机考研:数据结构常用算法精析(7)

2013-12-11 14:39:50来源:新东方在线编辑

  以上算法适合连通图,若是非连通图,则再增加一个主调算法,其核心语句是

  for (vi=1;vi<=n;vi++)

  if(!visited[vi])

  Traver(g,vi);

  判断回路问题:(通常有向图的回路问题,无向图的回路比较繁琐)

  两种判断有向图中有回路主要方法:

  1:利用深度优先遍历

  int visited[]=0; finished[]=0; //finished[i]=1表示i结点的所有邻接点都访问完了

  int flag=0;//回路的标记。有回路时值为1

  int DFS-travor(Adjlist g)

  { i=1;

  while(flag==0&&i<=n)

  if(visited[i]==0)

  { dfs(g,i);

  finished[i]=1;

  }//if

  }//总控程序,如果图有多个连通分量,分别进入每个连通分量

  void dfs(AdjList g,vertype v)

  //以顶点v开始深度优先遍历有向图g,顶点信息就是顶点编号.

  {

  printf("%d",v); visited[v]=1;

  p=g[v].firstarc;

  while(p!=null) //访问v的所有邻接点

  { j=p->adjvex;

  if(visited[j]==1&&finished[j]==0) //如果在v的邻接点中存在vj有访问过

  flag=0 ;// 的但vj的邻接点有没有全部访问完的,说明访问v是从vj那里

  // 进来的,而现在v和vj有直接的边说明存在回边,

  //那么就一定有回路了。(该结论只有在有向图中成立,在无向图中

  // 不成立,因为在无向图中vj可能就是v刚刚进来的上一个结点,

  //而这时在v中发现Vj也不奇怪,边是双向的,不能作为他是有回

  //路的充分条件。而有向图边是单向的)

  else if(visited[j]==0)

  { dfs(g,j);

  finished[j]=1;

  } //if

  p=p->next;

  }//while

  } //dfs结束

考研公开课小程序

本文关键字: 计算机 考研 数据结构

考研英语核心词汇营

背词+听课+练习+督学,学习得礼盒

更多资料
更多>>
更多内容

关注新东方在线考研服务号

获得21考研真题及答案解析

1. 打开手机微信【扫一扫】,识别上方二维码;
2.点击【关注公众号】,获取资料大礼包。

近10年考研真题及答案免费下载
更多>>
更多公开课>>
更多>>
更多资料