分享
 
 
 

图(邻接表存储)的遍历

王朝other·作者佚名  2006-02-01
窄屏简体版  字體: |||超大  

图的遍历是指从某个顶点出发,沿着某条搜索路径对图中所有的顶点进行访问且仅访问一次的过程。

1. 深度优先搜索(DFS)

深度优先搜索类似于树的前序遍历,也是一遇到顶点就进行访问。其特点是尽可能先对纵深方向进行搜索,因此很容易用递归算法实现。如果将遍历过程中走过的边连接起来,即可得到深度优先遍历生成树。

深度优先搜索遍历图的算法:首先访问指定的起始顶点v0,从v0出发,访问v0的一个未被访问过的邻接顶点w1,再从w1出发,访问w1的一个未被访问过的顶点w2,然后从w2出发,访问w2的一个未被访问过的邻接顶点w3。依次类推,直到一个所有邻接顶点都被访问过为止。

2. 广度优先搜索(BFS)

广度优先搜索类似于树的按层次遍历。首先访问指定的起始点v0,从v0出发,访问v0的所有未被访问过的邻接顶点w1,w2,… wk,然后再依次从w1,w2,… wk出发,访问它们的所有未被访问过的邻接顶点,依次类推,直到图中所有未被访问过的邻接顶点都被访问过为止。

广度优先遍历的特点是尽可能进行横向搜索,即最先访问的顶点其邻接点也被先访问。因此,借助一个队列来保存已被访问过的顶点序列。访问一个顶点vi时(出队),同时将vi相邻的其余结点入队。每个顶点只能入队一次。

图采用邻接链表结构存储。参考程序:

#define maxnode 40

#define null 0

#define m 20

#include <stdio.h>

typedef struct st_arc

{int adjvex;

int weight;

struct st_arc *nextarc;

}arcnode;

typedef struct

{int vertex;

struct st_arc *firstarc;

}vernode;

typedef vernode adjlist[maxnode];

int queue[maxnode];

void dfs(adjlist g,int k,int visited[]) //从顶点k出发,深度优先搜索

{arcnode *p;

int w;

visited[k]=1;

printf("%d",g[k].vertex);

p=g[k].firstarc;

while(p!=null)

{w=p->adjvex;

if(visited[w]==0)

dfs(g,w,visited);

p=p->nextarc;

}

}

void bfs(adjlist g,int k,int visited[]) //从顶点k出发,广度优先搜索

{int front=0,rear=1,w;

arcnode *p;

visited[k]=1; //访问初始顶点

printf("%d",k);

queue[rear]=k; //初始顶点入队列

while(front!=rear) //队列不为空

{front=(front+1)%m;

w=queue[front]; //按访问次序依次出队列

p=g[w].firstarc;

while(p!=null)

{if(visited[p->adjvex]==0)

{visited[p->adjvex]=1;

printf("%d",p->adjvex);

rear=(rear=1)%m;

queue[rear]=p->adjvex;;

}

p=p->nextarc;

}

}

}

void trave_bfs(adjlist g,int n)

{int i,visited[maxnode]; //数组visited标志图中的顶点是否已被访问

for(i=1;i<=n;i++)

visited[i]=0;

for(i=1;i<=n;i++)

if(visited[i]==0)

bfs(g,i,visited);

}

void trave_dfs(adjlist g,int n)

{int i,visited[maxnode]; //数组visited标志图中的顶点是否已被访问

for(i=1;i<=n;i++)

visited[i]=0;

for(i=1;i<=n;i++)

if(visited[i]==0)

dfs(g,i,visited);

}

void print(adjlist g,int n)

{arcnode *q;

int i;

printf("输出无向图的邻接链表示:\n");

for(i=1;i<=n;i++)

{printf("\t%d\t",i);

printf("%d->",g[i].vertex);

q=g[i].firstarc;

while(q!=null)

{printf("%d",q->adjvex);

printf("%d->",q->weight);

q=q->nextarc;

}

printf("\n");

}

}

main()

{arcnode *p,*q;

adjlist g;

int i,j,n,k,w,e;

printf("输入图中顶点的个数,边数:");

scanf("%d,%d",&n,&e);

for(k=1;k<=n;k++)

{getchar();

printf("\t第%d个顶点信息:",k);

scanf("%d",&g[k].vertex);

g[k].firstarc=null; //对顺序存储部分初始化

}

for(k=1;k<=e;k++)

{printf("第%d条边的起点,终点,权值:",k);

scanf("%d,%d,%d",&i,&j,&w);

q=(arcnode *)malloc(sizeof(arcnode));

q->adjvex=j;

q->weight=w;

q->nextarc=g[i].firstarc;

g[i].firstarc=q;

p=(arcnode *)malloc(sizeof(arcnode));

p->adjvex=i;

p->weight=w;

p->nextarc=g[j].firstarc;

g[j].firstarc=p;

}

print(g,n);

printf("\n");

printf("图的深度优先搜索:");

trave_dfs(g,n);

printf("\n");

printf("图的广度优先搜索:");

trave_bfs(g,n);

printf("\n");

}

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有