【图论算法部分详解】——(一)

让我们从最基本的开始:
一、概念:图论〔Graph Theory〕是数学的一个分支。它以图为研究对象。图论中的图是由若干给定的点及连接两点的线所构成的图形,这种图形通常用来描述某些事物之间的某种特定关系,用点代表事物,用连接两点的线表示相应两个事物间具有这种关系。
由此,可以得到两个相关的概念,边和结点(本帖讲算法,这些杂七杂八的概念忽略)。

二、遍历
图的遍历一般分为两种,BFS和DFS。
(1) BFS:广度优先搜索:

var a:array[0..1000,0..1000] of integer;
    i,j,k,n,s:integer;
    v:array[0..1000] of boolean;
    b:array[0..1000] of integer;
    front,tail:integer;
procedure bfs(x:integer);
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
assign(input,'bfs.in'); reset(input);
assign(output,'bfs.out');rewrite(output);
  
  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 writeln(b[i]);
close(input);
close(output);
end.

(2)DFS:深度优先搜索

type
   point=^link;
   link=record
     g:longint;
     next:point;
   end;
var
   i,j,k:longint;
   a:array[1..1000]of point;
   f:array[1..1000]of boolean;
   n,m:longint;
   x,y:longint;
procedure add(x,y:longint);
   var
     p:point;
   begin
     new(p);
     p^.g:=y;
     p^.next:=a[x];
     a[x]:=p;
   end;
procedure dfs(x:longint);
   var
     i,j,y:longint;
     p:point;
   begin
     f[x]:=true;
     write(x,' ');
     p:=a[x];
     while p<>nil do
       begin
        y:=p^.g;
        if not f[y] then dfs(y);
        p:=p^.next;
       end;
   end;
begin
   readln(n,m);
   fillchar(a,sizeof(a),0);
   for i:=1 to m do
     begin
       readln(x,y);
       add(x,y);
     end;
   fillchar(f,sizeof(f),0);
   dfs(1);
   writeln;
end.

0 条评论

目前还没有评论...