问题描述
已知无向图的邻接矩阵,以该矩阵为基础,给出广度优先搜索遍历序列,并且给出该无向图的连通分量的个数。在遍历时,当有多个点可选时,优先选择编号小的顶点。(即从顶点1开始进行遍历)
输入格式
第一行是1个正整数,为顶点个数n(n<100),顶点编号依次为1,2,…,n。后面是邻接矩阵,n行n列。
输出格式
共2行。第一行输出为无向图的广度优先搜索遍历序列,输出为顶点编号,顶点编号之间用空格隔开;第二行为无向图的连通分量的个数。
样例输入
6
0 1 0 0 0 0
1 0 0 0 1 0
0 0 0 1 0 0
0 0 1 0 0 0
0 1 0 0 0 1
0 0 0 0 1 0
样例输出
1 2 5 6 3 4
2
代码部分
#include<stdio.h>
#include<iostream>//c++代码
#include<queue>//c++封装好的队列
using namespace std;
typedef struct{
int vexnum;
int arcs[100][100];
}Graph;
int visited[100]={0};
int count=0;
int FirstAdjVex(Graph G,int v)
{
int i;
for(i=0;i<G.vexnum;i++)
{
if(G.arcs[v][i]==1&&visited[i]==0)
return i;
}
return -1;
}
int NextAdjVex(Graph G,int v,int w)
{
int i;
for(i=w;i<G.vexnum;i++)
{
if(G.arcs[v][i]==1&&visited[i]==0)
return i;
}
return -1;
}
void BFSTraverse(Graph G)
{
int i=0;
queue<int> q;
for(i=0;i<G.vexnum;i++)
{
if(visited[i]==0)
{
count++;
q.push(i);
cout<<i+1<<' ';//输出cout
visited[i]=1;
while(!q.empty())
{
int v=q.front();
q.pop();
for(int w=FirstAdjVex(G,v);w>0;w=NextAdjVex(G,v,w))
{
if(visited[w]==0)
{
q.push(w);
cout<<w+1<<' ';
visited[w]=1;
}
}
}
}
}
}
int main()
{
Graph G;
cin>>G.vexnum;//输入cin
int i,j;
for(i=0;i<G.vexnum;i++)
{
for(j=0;j<G.vexnum;j++)
cin>>G.arcs[i][j];
}
BFSTraverse(G);
cout<<endl<<count;
return 0;
}
记录下第二次发文,后续还会上传之前写的代码…