1763: 算法7-6:图的遍历——广度优先搜索

原创 2015年07月10日 09:46:19

题目描述

广度优先搜索遍历类似于树的按层次遍历的过程。其过程为:假设从图中的某顶点v出发,在访问了v之后依次访问v的各个未曾被访问过的邻接点,然后分别从这些邻接点出发依次访问它们的邻接点,并使“先被访问的顶点的邻接点”先于“后被访问的顶点的邻接点”被访问,直至图中所有已被访问的顶点的邻接点都被访问到。若此时图中尚有顶点未被访问,则另选图中一个未曾被访问的顶点作为起始点。重复上述过程,直至图中所有顶点都被访问到为止。
其算法可以描述如下:
在本题中,读入一个无向图的邻接矩阵(即数组表示),建立无向图并按照以上描述中的算法遍历所有顶点,输出遍历顶点的顺序。

输入

输入的第一行包含一个正整数n,表示图中共有n个顶点。其中n不超过50。
以后的n行中每行有n个用空格隔开的整数0或1,对于第i行的第j个0或1,1表示第i个顶点和第j个顶点有直接连接,0表示没有直接连接。当i和j相等的时候,保证对应的整数为0。
输入保证邻接矩阵为对称矩阵,即输入的图一定是无向图。

输出

只有一行,包含n个整数,表示按照题目描述中的广度优先遍历算法遍历整个图的访问顶点顺序。每个整数后输出一个空格,并请注意行尾输出换行。

样例输入

4 0 0 0 1 0 0 1 1 0 1 0 1 1 1 1 0

样例输出

0 3 1 2 
错的:program p1763;
var a:array[1..51,1..51]of longint;
 v:array[1..51]of boolean;
 i,j,k,n,front,tail:longint;
procedure gb;
 var i,j:longint;
 begin
  front:=1;
  tail:=1;
  fillchar(v,sizeof(v),false);
  v[front]:=true;
  write(front-1,' ');
  while front<=tail do
   begin
    for i:=1 to n do
    if (a[front,i]=1)and(v[i]=false)then
     begin
      inc(tail);
      v[i]:=true;
      write(i-1,' ');
     end;
      inc(front);
   end;
  end;
begin
 read(n);
 for i:=1 to n do
  for j:=1 to n do
   read(a[i,j]);
   gb;
 writeln;
end.
对的:program p1763;
var a:array[0..50,0..50] of longint;
    i,j,k,n,s:longint;
    v:array[0..50] of boolean;
    b:array[0..50] of longint;
    front,tail:longint;
procedure bfs(x:longint);
var j:integer;
begin
  v[i]:=true;
  b[tail]:=x;
  while front<=tail do
  begin
    for j:=1 to n do
    if (a[b[front],j]=1) and (v[j]=false) then
    begin
      inc(tail);
      v[j]:=true;
      b[tail]:=j;
    end;
    inc(front);
  end;
end;
begin
 readln(n);    front:=1;
  for i:=1 to n do
   for j:=1 to n do
   read(a[i,j]);
   for i:=1 to n do
    if not v[i] then begin tail:=front; bfs(i); end;
  for i:=1 to n do write(b[i]-1,' ');
  writeln;
end.
program heyingjin;
var a:array[0..55,0..55]of integer;
    e,i,j,k,top,bottom:integer;
    visited:array[0..55]of boolean;
    b:array[0..55]of integer;
begin
 assign(input,'shuru.txt');
 assign(output,'shuchu.txt');
 reset(input);
 rewrite(output);
 readln(e);
 for i:=0 to e-1 do
  for j:=0 to e-1 do read(a[i,j]);
 fillchar(visited,sizeof(visited),false);
 top:=1;bottom:=1;
 write(0);
 while top<=bottom do
  begin
  k:=b[top];  visited[k]:=true;
  for i:=0 to e-1 do
   if (a[k,i]=1) and (not visited[i]) then
    begin
    inc(bottom);
    b[bottom]:=i;
    visited[i]:=true;
    write(i,' ');
    end;
    inc(top);
  end;
 close(input);
 close(output);
 end.
版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

图的遍历之广度优先搜索

广度优先搜索遍历类似于树的按层次遍历的过程。假设从图中某个顶点v出发,在访问了v之后依次访问v的各个未曾访问过的邻接点,然后分别从这些邻接点出发依次访问它们的邻接点,并使用”先被访问的顶点的邻接点“先...

【算法导论】图的广度优先搜索遍历(BFS)

图的存储方法:邻接矩阵、邻接表         例如:有一个图如下所示: 则上图用邻接矩阵可以表示为: 用邻接表可以表示如下: 邻接矩阵可以很容易的用二维数组表示,下面主要看看怎样构成邻接表...

十二、图的遍历--(3)广度优先搜索算法

摘自计蒜客:http://www.jisuanke.com/course/35/7320 广度优先搜索算法(Breadth-First-Search, 简称BFS)是一种连通图的常用遍历策略,通常用于...

ACM入门(3)——图的遍历——广度优先搜索

ACM入门(3)——图的遍历——广度优先搜索基本算法: 由Moore和Lee独立提出 给定图G和一个源点s, 广度优先遍历按照从近到远的顺序考虑各条边. 算法求出从s到各点的距离 广度优先的过程对结点...
  • clbxp
  • clbxp
  • 2011-06-29 18:53
  • 1757

【Java】利用单链表遍历、队列通过广度优先搜索算法来求各个的连通分量

这里就不再用书上的大堆废话的来说,广度优先搜索算法就是遍历一个图所有点的算法,也就说要对图中的每一个点进行访问,访问之后你才能对点进行操作。由于你对一个图进行操作,那么你必须对图上的每个点进行操作,所...

广度优先搜索——BFS遍历

广度优先搜索(Breadth First Search , BFS)是一个分层搜索的过程,没有回退过程,是非递归的。

图的遍历之广度优先搜索(Breadth First Search)

描述广度优先搜索算法(Breadth First Search)与树的层序遍历(level-order traversal)类似,基本思想是思想是: 从图中某顶点v出发,访问v之后,并将其访问标志置为...

图的广度优先搜索遍历(邻接表&邻接矩阵)(C++)

图的广度优先搜索遍历这里只列了迭代的算法,递归比较困难搜索遍历需要借助一个队列。 每次将当前节点出队列,以及让该节点的所有未被访问的邻接节点入队列,重复直至队列为空。 节点的出队列的顺序构成了广度...

无向图的深度和广度优先搜索遍历(C)

无向图的深度和广度优先搜索遍历(C)   以邻接表作为图的存储结构,实现连通无向图的深度优先和广度优先遍历。以指定的结点作为起点,分别输出每种遍历下的结...

图的遍历---广度优先搜索(BFS)

上一篇我们讲解了图
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)