怎么用c语言写图的优先遍历程序?

怎么用c语言写图的优先遍历程序?,第1张

写法:

图的遍历是指按某条搜索路径访问图中每个结点,使得每个结点均被访问一次,而且仅被访问一次。图的遍历有深度遍历算法和广度遍历算法,最近阿杰做了关于图的遍历的算法,下面是图的遍历深度优先的算法(C语言程序):

#include<stdio.h>

#include<malloc.h>

#define MaxVertexNum 5

#define m 5

#define TRUE 1

#define NULL 0

typedef   struct   node

 int  adjvex

 struct  node  *next

}JD

typedef   struct  EdgeNode

{

 int   vexdata

    JD  *firstarc

}TD

typedef struct

{

 TD  ag[m]

 int n

}ALGRAPH

void DFS(ALGRAPH *G,int i)

{

 JD *p

 int visited[80] 

 printf("visit vertex:%d->",G->ag[i].vexdata)

 visited[i]=1

 p=G->ag[i].firstarc 

 while(p)

 {

  if (!visited[p->adjvex])

   DFS(G,p->adjvex)

  p=p->next

 }

}

void creat(ALGRAPH *G)

{

 int i,m1,j

 JD *p,*p1

 printf("please input the number of graph\n")

 scanf("%d",&G->n)

 for(i=0i<G->ni++)

 {

  printf("please input the info of node %d",i)

  scanf("%d",&G->ag[i].vexdata)

  printf("please input the number of arcs which adj to  %d",i)

  scanf("%d",&m1)

  printf("please input the adjvex position of the first arc\n")

  p=(JD *)malloc(sizeof(JD))

  scanf("%d",&p->adjvex)

  p->next=NULL

  G->ag[i].firstarc=p

  p1=p

  for(j=2 j<=m1j++)

  {

   printf("please input the position of the next arc vexdata\n")

   p=(JD *)malloc(sizeof(JD))

   scanf("%d",&p->adjvex)

   p->next=NULL

   p1->next=p

   p1=p

  }

 }

}

int  visited[MaxVertexNum]

void DFSTraverse(ALGRAPH *G)

{

 int i

 for(i=0i<G->ni++)

  visited[i]=0

 for(i=0i<G->ni++)

  if(!visited[i])

   DFS(G,i)

}

int main()

{

 ALGRAPH *G

 printf("下面以临接表存储一个图;\n")

 creat(G)

 printf("下面以深度优先遍历该图 \n")

 DFSTraverse(G)

 getchar()

}

楼主你好,下面是源程序!

/*/////////////////////////////////////////////////////////////*/

/* 图的深度优先遍历 */

/*/////////////////////////////////////////////////////////////*/

#include <stdlib.h>

#include <stdio.h>

struct node /* 图顶点结构定义 */

{

int vertex /* 顶点数据信息 */

struct node *nextnode/* 指下一顶点的指标 */

}

typedef struct node *graph /* 图形的结构新型态 */

struct node head[9] /* 图形顶点数组 */

int visited[9] /* 遍历标记数组 */

/********************根据已有的信息建立邻接表********************/

void creategraph(int node[20][2],int num)/*num指的是图的边数*/

{

graph newnode/*指向新节点的指针定义*/

graph ptr

int from /* 边的起点 */

int to /* 边的终点 */

int i

for ( i = 0i <numi++ )/* 读取边线信息,插入邻接表*/

{

from = node[i][0]/*边线的起点*/

to = node[i][1] /* 边线的终点 */

/* 建立新顶点 */

newnode = ( graph ) malloc(sizeof(struct node))

newnode->vertex = to /* 建立顶点内容 */

newnode->nextnode = NULL /* 设定指标初值 */

ptr = &(head[from])/* 顶点位置 */

while ( ptr->nextnode != NULL ) /* 遍历至链表尾 */

ptr = ptr->nextnode/* 下一个顶点 */

ptr->nextnode = newnode /* 插入节点*/

}

}

/********************** 图的深度优先搜寻法********************/

void dfs(int current)

{

graph ptr

visited[current] = 1 /* 记录已遍历过 */

printf("vertex[%d]\n",current) /* 输出遍历顶点值 */

ptr = head[current].nextnode /* 顶点位置 */

while ( ptr != NULL ) /* 遍历至链表尾 */

{

if ( visited[ptr->vertex] == 0 ) /* 如过没遍历过 */

dfs(ptr->vertex) /* 递回遍历呼叫 */

ptr = ptr->nextnode /* 下一个顶点 */

}

}

/****************************** 主程序******************************/

void main()

{

graph ptr

int node[20][2] = { {1, 2}, {2, 1}, /* 边线数组 */

{1, 3}, {3, 1},

{1, 4}, {4, 1},

{2, 5}, {5, 2},

{2, 6}, {6, 2},

{3, 7}, {7, 3},

{4, 7}, {4, 4},

{5, 8}, {8, 5},

{6, 7}, {7, 6},

{7, 8}, {8, 7} }

int i

clrscr()

for ( i = 1i <= 8i++ ) /* 顶点数组初始化 */

{

head[i].vertex = i/*设定顶点值 */

head[i].nextnode = NULL /* 指针为空 */

visited[i] = 0/* 设定遍历初始标志 */

}

creategraph(node,20) /*建立邻接表 */

printf("Content of the gragh's ADlist is:\n")

for ( i = 1i <= 8i++ )

{

printf("vertex%d ->",head[i].vertex)/* 顶点值*/

ptr = head[i].nextnode/* 顶点位置 */

while ( ptr != NULL ) /* 遍历至链表尾 */

{

printf(" %d ",ptr->vertex) /* 印出顶点内容 */

ptr = ptr->nextnode/* 下一个顶点 */

}

printf("\n") /* 换行 */

}

printf("\nThe end of the dfs are:\n")

dfs(1) /* 打印输出遍历过程 */

printf("\n") /* 换行 */

puts(" Press any key to quit...")

getch()

}

/*//////////////////////////////////////////*/

/*图形的广度优先搜寻法 */

/* ///////////////////////////////////////*/

#include <stdlib.h>

#include <stdio.h>

#define MAXQUEUE 10 /* 队列的最大容量 */

struct node /* 图的顶点结构定义 */

{

int vertex

struct node *nextnode

}

typedef struct node *graph /* 图的结构指针*/

struct node head[9] /* 图的顶点数组 */

int visited[9] /* 遍历标记数组 */

int queue[MAXQUEUE] /* 定义序列数组 */

int front = -1 /* 序列前端*/

int rear = -1 /* 序列后端*/

/***********************二维数组向邻接表的转化****************************/

void creategraph(int node[20][2],int num)

{

graph newnode/* 顶点指针 */

graph ptr

int from /* 边起点 */

int to /* 边终点 */

int i

for ( i = 0i <numi++ )/* 第i条边的信息处理*/

{

from = node[i][0] /* 边的起点 */

to = node[i][1] /* 边的终点 */

/* 建立新顶点 */

newnode = ( graph ) malloc(sizeof(struct node))

newnode->vertex = to /*顶点内容 */

newnode->nextnode = NULL /* 设定指针初值 */

ptr = &(head[from]) /* 顶点位置 */

while ( ptr->nextnode != NULL ) /* 遍历至链表尾 */

ptr = ptr->nextnode/* 下一个顶点 */

ptr->nextnode = newnode /* 插入第i个节点的链表尾部 */

}

}

/************************ 数值入队列************************************/

int enqueue(int value)

{

if ( rear >= MAXQUEUE )/* 检查伫列是否全满 */

return -1 /* 无法存入 */

rear++ /* 后端指标往前移 */

queue[rear] = value /* 存入伫列 */

}

/************************* 数值出队列*********************************/

int dequeue()

{

if ( front == rear ) /* 队列是否为空 */

return -1 /* 为空,无法取出 */

front++ /* 前端指标往前移 */

return queue[front] /* 从队列中取出信息 */

}

/*********************** 图形的广度优先遍历************************/

void bfs(int current)

{

graph ptr

/* 处理第一个顶点 */

enqueue(current) /* 将顶点存入队列 */

visited[current] = 1 /* 已遍历过记录标志置疑1*/

printf(" Vertex[%d]\n",current) /* 打印输出遍历顶点值 */

while ( front != rear )/* 队列是否为空 */

{

current = dequeue() /* 将顶点从队列列取出 */

ptr = head[current].nextnode /* 顶点位置 */

while ( ptr != NULL ) /* 遍历至链表尾 */

{

if ( visited[ptr->vertex] == 0 ) /*顶点没有遍历过*/

{

enqueue(ptr->vertex)/* 奖定点放入队列 */

visited[ptr->vertex] = 1/* 置遍历标记为1*/

printf(" Vertex[%d]\n",ptr->vertex)/* 印出遍历顶点值 */

}

ptr = ptr->nextnode/* 下一个顶点 */

}

}

}

/*********************** 主程序 ************************************/

/*********************************************************************/

void main()

{

graph ptr

int node[20][2] = { {1, 2}, {2, 1}, /* 边信息数组 */

{6, 3}, {3, 6},

{2, 4}, {4, 2},

{1, 5}, {5, 1},

{3, 7}, {7, 3},

{1, 7}, {7, 1},

{4, 8}, {8, 4},

{5, 8}, {8, 5},

{2, 8}, {8, 2},

{7, 8}, {8, 7} }

int i

clrscr()

puts("This is an example of Width Preferred Traverse of Gragh.\n")

for ( i = 1i <= 8i++ )/*顶点结构数组初始化*/

{

head[i].vertex = i

head[i].nextnode = NULL

visited[i] = 0

}

creategraph(node,20) /* 图信息转换,邻接表的建立 */

printf("The content of the graph's allist is:\n")

for ( i = 1i <= 8i++ )

{

printf(" vertex%d =>",head[i].vertex)/* 顶点值 */

ptr = head[i].nextnode/* 顶点位置 */

while ( ptr != NULL ) /* 遍历至链表尾 */

{

printf(" %d ",ptr->vertex) /* 打印输出顶点内容 */

ptr = ptr->nextnode/* 下一个顶点 */

}

printf("\n") /* 换行 */

}

printf("The contents of BFS are:\n")

bfs(1) /* 打印输出遍历过程 */

printf("\n") /* 换行 */

puts(" Press any key to quit...")

getch()

}

program graph01

{******** 邻接矩阵表示的无向图DFS递归算法 **********}

{******* By DuQinglong 2005.3 *******}

const maxn=20

type graph=record

a:array[1..maxn,1..maxn]of integer

vexn:integer

end

var g:graph

f:array[1..maxn]of boolean {** flag 顶点标记数组 **}

fin,fout:text

i,j:integer

procedure dfs(g:graphi:integer)

var j:integer

begin

write(fout,'V',i:1,' ') {*** 访问顶点i ***}

f[i]:=true

for j:=1 to g.vexn do

if ((not f[j]) and (g.a[i,j]=1)) then dfs(g,j)

end

procedure trav_dfs(g:graph)

var i:integer

begin

fillchar(f,sizeof(f),false) {*** 初始化标记数组 ***}

for i:=1 to g.vexn do

if not f[i] then dfs(g,i)

end

begin

assign(fin,'a.in')

assign(fout,'a.out')

reset(fin)

rewrite(fout)

readln(fin,g.vexn)

for i:=1 to g.vexn do

for j:=1 to g.vexn do

read(fin,g.a[i,j])

close(fin)

trav_dfs(g)

close(fout)

end.

program graph02

{********邻接矩阵表示的无向图DFS非递归算法**********}

const maxn=20

type graph=record

a:array[1..maxn,1..maxn]of integer

vexn:integer

end

var g:graph

f:array[1..maxn]of boolean {**flag**}

stack:array[1..maxn]of integer

fin,fout:text

i,j,top:integer{**** top:栈顶指针 ****}

procedure dfs(g:graphi:integer)

var t:integer

begin

write(fout,'V',i:1,' '){*** 访问顶点i ***}

f[i]:=true {*** 置顶点i访问标记 ***}

top:=1

stack[top]:=i {*** 顶点i入栈 ***}

repeat

t:=1

while ((g.a[stack[top],t]=0)or f[t]) do inc(t)

if (t>g.vexn) then dec(top) {*** 没有满足条件的顶点,则退栈 ***}

else begin

write(fout,'V',t:1,' ')

f[t]:=true

inc(top)

stack[top]:=t

end

until top=0

end

procedure trav_dfs(g:graph)

var i:integer

begin

fillchar(f,sizeof(f),false) {*** 初始化标记数组 ***}

for i:=1 to g.vexn do

if not f[i] then dfs(g,i)

end

begin

assign(fin,'a.in')

assign(fout,'a.out')

reset(fin)

rewrite(fout)

readln(fin,g.vexn)

for i:=1 to g.vexn do

for j:=1 to g.vexn do

read(fin,g.a[i,j])

close(fin)

trav_dfs(g)

close(fout)

end.

program graph03

{******** 邻接表表示的无向图DFs递归算法 **********}

{******* By DuQinglong 2005.3 *******}

const maxn=10

type

datatype=integer

nodep=^node

node=record {*** 邻接表结点 ***}

vertex:1..maxn

next:nodep

end

gnode=record {*** 图中数据结点***}

data:datatype

next:nodep

end

graph=record {*** 图的类型 ***}

a:array[1..maxn]of gnode

vexn:integer

end

var g:graph

f:array[1..maxn]of boolean {**flag**}

fin,fout:text

{*** 输入文件要求:第一行数据为图顶点个数,从第二行开始,第i行第一个数据为第i个结点的数据,

后面的为第i个结点的邻接顶点的编号 ***}

procedure buildadjlist(var g:graph) {*** 建立图的结构,用邻接表表示 ***}

var i,t:integer p,q:nodep k:1..maxn

begin

readln(fin,g.vexn) {*** 读入图的顶点个数 ***}

for i:=1 to g.vexn do

begin

read(fin,g.a[i].data)

g.a[i].next:=nil

t:=0

while not eoln(fin) do{*** 采用尾插法建立链表 ***}

begin

read(fin,k)

t:=t+1

new(p)

p^.vertex:=k

p^.next:=nil

if (t=1) then begin g.a[i].next:=pq:=pend

else begin q^.next:=p q:=p end

end

readln(fin) {*** 文件指针指向下一行 ***}

end

end

procedure dfs(g:graphi:integer) {*** 输出从顶点i开始的连通分量 ***}

var p:nodep

begin

write(fout,'V',i:1,' ')

f[i]:=true

p:=g.a[i].next

while (p<>nil) do

begin

if (not f[p^.vertex]) then dfs(g,p^.vertex)

p:=p^.next

end

end

procedure trav_dfs(g:graph) {*** 访问图中所有顶点 ***}

var i:integer

begin

fillchar(f,sizeof(f),false) {*** 将访问标记数组置为false ***}

for i:=1 to g.vexn do

if (not f[i]) then dfs(g,i)

end

begin

assign(fin,'a.in')

assign(fout,'a.out')

reset(fin)

rewrite(fout)

buildadjlist(g)

close(fin)

trav_dfs(g)

close(fout)

end.

program graph02

{********邻接表表示的无向图DFS 非递归算法**********}

{******* By DuQinglong 2005.3 *******}

const maxn=10

type

datatype=integer

nodep=^node

node=record {*** 邻接表结点 ***}

vertex:1..maxn

next:nodep

end

gnode=record {*** 图中数据结点***}

data:datatype

head:nodep

end

graph=record {*** 图的类型 ***}

a:array[1..maxn]of gnode

vexn:integer

end

var g:graph

f:array[1..maxn]of boolean {**flag**}

stack:array[1..maxn]of integer top:integer

fin,fout:text

{*** 输入文件要求:第一行数据为图顶点个数,从第二行开始,第i行第一个数据为第i个结点的数据,

后面的为第i个结点的邻接顶点的编号 ***}

procedure buildadjlist(var g:graph) {*** 建立图的结构,用邻接表表示 ***}

var i,t:integer p,q:nodep k:1..maxn

begin

readln(fin,g.vexn) {*** 读入图的顶点个数 ***}

for i:=1 to g.vexn do

begin

read(fin,g.a[i].data)

g.a[i].head:=nil

t:=0

while not eoln(fin) do{*** 采用尾插法建立链表 ***}

begin

read(fin,k)

t:=t+1

new(p)

p^.vertex:=k

p^.next:=nil

if (t=1) then begin g.a[i].head:=pq:=pend

else begin q^.next:=p q:=p end

end

readln(fin) {*** 文件指针指向下一行 ***}

end

end

procedure dfs(g:graphi:integer) {*** 输出从顶点i开始的连通分量 ***}

var p:nodep

begin

write(fout,'V',i:1,' ')

f[i]:=true

top:=1 stack[top]:=i

repeat

p:=g.a[stack[top]].head

while (p<>nil)and (f[p^.vertex]) do

p:=p^.next

if p=nil then dec(top)

else begin

i:=p^.vertex

f[i]:=true

write(fout,'V',i:1,' ')

inc(top)

stack[top]:=i

end

until top=0

end

procedure trav_dfs(g:graph) {*** 访问图中所有顶点 ***}

var i:integer

begin

fillchar(f,sizeof(f),false) {*** 将访问标记数组置为false ***}

for i:=1 to g.vexn do

if (not f[i]) then dfs(g,i)

end

begin

assign(fin,'a.in')

assign(fout,'a.out')

reset(fin)

rewrite(fout)

buildadjlist(g)

close(fin)

trav_dfs(g)

close(fout)

end.

program graph05

{******** 邻接矩阵表示的无向图BFS递归算法 **********}

{******* By DuQinglong 2005.3 *******}

const maxn=20

type graph=record

a:array[1..maxn,1..maxn]of integer

vexn:integer

end

var g:graph

f:array[1..maxn]of boolean {**flag**}

qu:array[1..maxn]of integer {**队列**}

fin,fout:text

i,j,front,rear:integer {** front: 队头指针 rear: 队尾指针 **}

procedure bfs(g:graphi:integer)

var j:integer

begin

for j:=1 to g.vexn do

if ((not f[j]) and (g.a[i,j]=1)) then

begin

write(fout,'V',j:1,' '){*** 访问顶点j ***}

f[j]:=true {*** 置顶点访问标记 ***}

inc(rear)

if rear>g.vexn then rear:=1 {*** 保证队列为循环队列 ***}

qu[rear]:=j {*** 顶点j入队 ***}

end

while (front<>rear) do{*** 当队列不为空时,出队 ***}

begin

inc(front)

if front>g.vexn then front:=1

bfs(g,qu[front])

end

end

procedure trav_bfs(g:graph)

var i:integer

begin

fillchar(f,sizeof(f),false)

for i:=1 to g.vexn do

if not f[i] then

begin

write(fout,'V',i:1,' ')

f[i]:=true {*** 置访问标记 ***}

front:=1 rear:=1 {*** 初始化队列 ***}

bfs(g,i)

end

end

begin

assign(fin,'a.in')

assign(fout,'a.out')

reset(fin)

rewrite(fout)

readln(fin,g.vexn)

for i:=1 to g.vexn do

for j:=1 to g.vexn do

read(fin,g.a[i,j])

close(fin)

trav_bfs(g)

close(fout)

end.

program graph06

{******** 邻接矩阵表示的无向图BFS非递归算法 **********}

{******* By DuQinglong 2005.3 *******}

const maxn=20

type graph=record

a:array[1..maxn,1..maxn]of integer

vexn:integer

end

var g:graph

f:array[1..maxn]of boolean {**flag**}

qu:array[1..maxn]of integer {**队列**}

fin,fout:text

i,j,front,rear:integer {** front: 队头指针 rear: 队尾指针 **}

procedure bfs(g:graphi:integer)

var j,t:integer

begin

write(fout,'V',i:1,' ')

f[i]:=true front:=0 rear:=1 qu[rear]:=i

while (front<>rear) do

begin

inc(front) t:=qu[front] {*** 出队 *** 作 ***}

for j:=1 to g.vexn do {*** 邻接顶点入队 ***}

if ((not f[j]) and (g.a[t,j]=1)) then

begin

write(fout,'V',j:1,' ')

f[j]:=true

inc(rear){*** 入队 *** 作 ***}

if rear>g.vexn then rear:=1

qu[rear]:=j

end

end

end

procedure trav_bfs(g:graph)

var i:integer

begin

fillchar(f,sizeof(f),false)

for i:=1 to g.vexn do

if not f[i] then bfs(g,i)

end

begin

assign(fin,'a.in')

assign(fout,'a.out')

reset(fin)

rewrite(fout)

readln(fin,g.vexn)

for i:=1 to g.vexn do

for j:=1 to g.vexn do

read(fin,g.a[i,j])

close(fin)

trav_bfs(g)

close(fout)

end.

program graph07

{******** 邻接表表示的无向图BFs递归算法 **********}

{******* By DuQinglong 2005.3 *******}

const maxn=10

type

datatype=integer

nodep=^node

node=record {*** 邻接表结点 ***}

vertex:1..maxn

next:nodep

end

gnode=record {*** 图中数据结点***}

data:datatype

head:nodep

end

graph=record {*** 图的类型 ***}

a:array[1..maxn]of gnode

vexn:integer

end

var g:graph

f:array[1..maxn]of boolean {**flag**}

qu:array[1..maxn]of integer

front,rear:integer

fin,fout:text

{*** 输入文件要求:第一行数据为图顶点个数,从第二行开始,第i行第一个数据为第i个结点的数据,

后面的为第i个结点的邻接顶点的编号 ***}

procedure buildadjlist(var g:graph) {*** 建立图的结构,用邻接表表示 ***}

var i,t:integer p,q:nodep k:1..maxn

begin

readln(fin,g.vexn) {*** 读入图的顶点个数 ***}

for i:=1 to g.vexn do

begin

read(fin,g.a[i].data)

g.a[i].head:=nil

t:=0

while not eoln(fin) do{*** 采用尾插法建立链表 ***}

begin

read(fin,k)

t:=t+1

new(p)

p^.vertex:=k

p^.next:=nil

if (t=1) then begin g.a[i].head:=pq:=pend

else begin q^.next:=p q:=p end

end

readln(fin) {*** 文件指针指向下一行 ***}

end

end

procedure bfs(g:graphi:integer) {*** 输出从顶点i开始的连通分量 ***}

var p:nodep

begin

p:=g.a[i].head

while (p<>nil) do

begin

if (not f[p^.vertex]) then

begin

write(fout,'V',p^.vertex:1,' ')

f[p^.vertex]:=true

inc(rear)

if (rear>maxn)then rear:=1

qu[rear]:=p^.vertex

end

p:=p^.next

end

while (front<>rear) do

begin

inc(front)

if (front>maxn) then front:=1

bfs(g,qu[front])

end

end

procedure trav_bfs(g:graph) {*** 访问图中所有顶点 ***}

var i:integer

begin

fillchar(f,sizeof(f),false) {*** 将访问标记数组置为false ***}

for i:=1 to g.vexn do

if (not f[i]) then

begin

write(fout,'V',i:1,' ')

f[i]:=truefront:=1 rear:=1

bfs(g,i)

end

end

begin

assign(fin,'a.in')

assign(fout,'a.out')

reset(fin)

rewrite(fout)

buildadjlist(g)

close(fin)

trav_bfs(g)

close(fout)

end.

program graph08

{******** 邻接表表示的无向图BFS非递归算法 **********}

{******* By DuQinglong 2005.3 *******}

const maxn=20

type

datatype=integer

nodep=^node

node=record {*** 邻接表结点 ***}

vertex:1..maxn

next:nodep

end

gnode=record {*** 图中数据结点***}

data:datatype

head:nodep

end

graph=record {*** 图的类型 ***}

a:array[1..maxn]of gnode

vexn:integer

end

var g:graph

f:array[1..maxn]of boolean {**flag**}

qu:array[1..maxn]of integer

front,rear:integer

fin,fout:text

{*** 输入文件要求:第一行数据为图顶点个数,从第二行开始,第i行第一个数据为第i个结点的数据,

后面的为第i个结点的邻接顶点的编号 ***}

procedure buildadjlist(var g:graph) {*** 建立图的结构,用邻接表表示 ***}

var i,t:integer p,q:nodep k:1..maxn

begin

readln(fin,g.vexn) {*** 读入图的顶点个数 ***}

for i:=1 to g.vexn do

begin

read(fin,g.a[i].data)

g.a[i].head:=nil

t:=0

while not eoln(fin) do{*** 采用尾插法建立链表 ***}

begin

read(fin,k)

t:=t+1

new(p)

p^.vertex:=k

p^.next:=nil

if (t=1) then begin g.a[i].head:=pq:=pend

else begin q^.next:=p q:=p end

end

readln(fin) {*** 文件指针指向下一行 ***}

end

end

procedure bfs(g:graphi:integer) {*** 输出从顶点i开始的连通分量 ***}

var p:nodept:integer

begin

write(fout,'V',i:1,' ')

f[i]:=true

front:=0 rear:=1 qu[rear]:=i {*** i入队 ***}

while (front<>rear) do

begin

inc(front) {*** 出队 *** 作 ***}

if front>maxn then front:=1

t:=qu[front]

p:=g.a[t].head

while (p<>nil) do

begin

if not f[p^.vertex] then {*** 邻接顶点未被访问时 ***}

begin

write(fout,'V',p^.vertex:1,' ')

f[p^.vertex]:=true

inc(rear)

if (rear>maxn) then rear:=1

qu[rear]:=p^.vertex

end

p:=p^.next

end

end

end

procedure trav_bfs(g:graph) {*** 访问图中所有顶点 ***}

var i:integer

begin

fillchar(f,sizeof(f),false) {*** 将访问标记数组置为false ***}

for i:=1 to g.vexn do

if (not f[i]) then bfs(g,i)

end

begin

assign(fin,'a.in')

assign(fout,'a.out')

reset(fin)

rewrite(fout)

buildadjlist(g)

close(fin)

trav_bfs(g)

close(fout)

end.


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/yw/12015039.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-20
下一篇2023-05-20

发表评论

登录后才能评论

评论列表(0条)

    保存