广度优先搜索BFS 之图的构造及遍历
2017-03-05 12:22
375 查看
1. 由给定的顶点和边的信息构造图的邻接矩阵存储; 对该图进行深度优先搜索,输出搜索得到的结点序列;
3. 以邻接表作存储结构,用克鲁斯卡尔算法构造最小生成树。
/*
5 6
abcde
0 1 10
0 3 20
1 2 30
1 4 40
2 3 50
2 4 60
*/
#include<iostream>
#include<cstdio>
#include<queue>
#include<cstring>
usingnamespace std;
#definemaxn 100
#defineINF 999999
#defineMAXVEX 100
typedefstruct {
char vexs[MAXVEX];
double arcs[MAXVEX][MAXVEX];
int n,e;
}mGraph;
queue<char>qu;
intflag[maxn];
voidcreateAdjMatrix(mGraph *G)
{
int i,j,k;
double w;
printf("请输入图的节点数和边数:\n");
scanf("%d%d",&G->n,&G->e);
getchar();
for(i=0;i<G->n;i++) flag[i]=0;
printf("请输入图的节点:\n");
for(k=0;k<G->n;k++)scanf("%c",&G->vexs[k]);
for(i=0;i<G->n;i++)
for(j=0;j<G->n;j++)
G->arcs[i][j]=INF;
printf("请输入图的边以及边的权:\n");
for(k=0;k<G->e;k++)
{
scanf("%d%d%lf",&i,&j,&w);
G->arcs[i][j]=w;
G->arcs[j][i]=w;
}
}
voidbfs(mGraph *G)
{
int num=0;
for(int i=0;i<G->n;i++) flag[i]=0;
for(int i=0; i<G->n; i++)
if(flag[i]==0)
{
flag[i]=1;
qu.push(G->vexs[i]);
while(!qu.empty())
{
char ss=qu.front();
qu.pop();
if(num==G->n-1)
cout<<ss<<endl;
else
cout<<ss<<"";
num++;
for(int j=0; j<G->n; j++)
if(G->arcs[i][j]<INF&& flag[j]==0)
{
qu.push(G->vexs[j]); flag[j]=1;
}
}
}
}
intmain()
{
mGraph m;
createAdjMatrix(&m);
printf("遍历序列如下:\n");
bfs(&m);
return 0;
}
3. 以邻接表作存储结构,用克鲁斯卡尔算法构造最小生成树。
/*
5 6
abcde
0 1 10
0 3 20
1 2 30
1 4 40
2 3 50
2 4 60
*/
#include<iostream>
#include<cstdio>
#include<queue>
#include<cstring>
usingnamespace std;
#definemaxn 100
#defineINF 999999
#defineMAXVEX 100
typedefstruct {
char vexs[MAXVEX];
double arcs[MAXVEX][MAXVEX];
int n,e;
}mGraph;
queue<char>qu;
intflag[maxn];
voidcreateAdjMatrix(mGraph *G)
{
int i,j,k;
double w;
printf("请输入图的节点数和边数:\n");
scanf("%d%d",&G->n,&G->e);
getchar();
for(i=0;i<G->n;i++) flag[i]=0;
printf("请输入图的节点:\n");
for(k=0;k<G->n;k++)scanf("%c",&G->vexs[k]);
for(i=0;i<G->n;i++)
for(j=0;j<G->n;j++)
G->arcs[i][j]=INF;
printf("请输入图的边以及边的权:\n");
for(k=0;k<G->e;k++)
{
scanf("%d%d%lf",&i,&j,&w);
G->arcs[i][j]=w;
G->arcs[j][i]=w;
}
}
voidbfs(mGraph *G)
{
int num=0;
for(int i=0;i<G->n;i++) flag[i]=0;
for(int i=0; i<G->n; i++)
if(flag[i]==0)
{
flag[i]=1;
qu.push(G->vexs[i]);
while(!qu.empty())
{
char ss=qu.front();
qu.pop();
if(num==G->n-1)
cout<<ss<<endl;
else
cout<<ss<<"";
num++;
for(int j=0; j<G->n; j++)
if(G->arcs[i][j]<INF&& flag[j]==0)
{
qu.push(G->vexs[j]); flag[j]=1;
}
}
}
}
intmain()
{
mGraph m;
createAdjMatrix(&m);
printf("遍历序列如下:\n");
bfs(&m);
return 0;
}
相关文章推荐
- java学习笔记之图的遍历(广度优先搜索BFS)
- BFS(广度优先遍历搜索解析)
- 广度优先搜索——BFS遍历
- 广度优先遍历(搜索)(BFS)
- bfs广度优先搜索对于图的遍历顺序
- [SDUT](2141)数据结构实验之图论一:基于邻接矩阵的广度优先搜索遍历 ---BFS(图)
- 数据结构之 图论---基于邻接矩阵的广度优先搜索遍历(输出bfs遍历序列)
- 【数据结构作业五】以邻接表作存储结构,广度遍历图的优先搜索序列
- 邻接矩阵存储的无向图深度优先(DFS)广度优先(BFS)遍历
- BFS-迷宫问题-用宽度(广度)优先搜索解决最优路径问题
- 数据结构实验之图论一:基于邻接矩阵的广度优先搜索遍历
- 广度/宽度优先搜索(BFS)
- leetcode 515. Find Largest Value in Each Tree Row 二叉树每一层最大值+广度优先遍历BFS
- 算法复习 - 广度优先遍历、深度优先遍历(BFS、DFS)
- (BFS)广度优先搜索例子:迷宫,寻找连块数
- leetcode 752. Open the Lock 开锁 + 十分典型的广度优先遍历BFS
- 广度优先搜索,图的遍历
- POJ 3126-Prime Path-广度优先搜索bfs
- Java实现数据结构之深度优先搜索DFS和广度优先搜索BFS
- 图的广度优先遍历BFS(邻接矩阵表示法)