关闭

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

391人阅读 评论(0) 收藏 举报
分类:

题目描述

广度优先搜索遍历类似于树的按层次遍历的过程。其过程为:假设从图中的某顶点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.
0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:14877次
    • 积分:106
    • 等级:
    • 排名:千里之外
    • 原创:91篇
    • 转载:0篇
    • 译文:0篇
    • 评论:0条
    文章分类
    文章存档