您的位置:首页 > 其它

广度优先搜索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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: