- 图
- 2017-10-27 13:27:56 @
让我们从最基本的开始:
一、概念:图论〔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 条评论
目前还没有评论...