Description
读入图的邻接矩阵以及一个顶点的编号(图中顶点的编号为从1开始的连续正整数。顶点在邻接矩阵的行和列上按编号递增的顺序排列。邻接矩阵中元素值为1,表示对应顶点间有一条边,元素值为0,表示对应顶点间没有边),输出从该顶点开始进行广度优先搜索(Breadth-First Search, BFS)的顶点访问序列。假设顶点数目<=100,并且,对于同一顶点的多个邻接顶点,按照顶点编号从小到大的顺序进行搜索。
Input
第一行为两个整数n和s (0<n<=100, 0<s<=100),n表示图中顶点的数目,s为搜索的起始顶点的编号。
后面的n行表示图的邻接矩阵,每行为n个整数,相邻整数间用一个空格间隔。
Output
一行(行末没有换行符),表示从顶点s开始进行BFS的顶点访问序列,相邻顶点间用一个空格间隔。
Sample Input
Copy sample input to clipboard
4 3
0 1 1 0
1 0 1 1
1 1 0 1
0 1 1 0
Sample Output
3 1 2 4
我的代码如下:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cctype>
#include<string>
#include<algorithm>
#include<stack>
#include<vector>
#include<queue>
#include<iomanip>
#include<cmath>
#include<ctime>
#include<climits>
using namespace std;
typedef int ElemType ;
typedef int VrType ;
typedef char VertexType ;
typedef struct ArcCell{
VrType adj;
}ArcCell, AdjMatrix[111][111];
typedef struct{
int vexs[111];
AdjMatrix arcs;
int vexnum,arcnum;
}MGraph;
bool visited[111];
int FirstAdjVex(MGraph G,int v){
int i ;
for(i = 0; i<G.vexnum; i++)
if( G.arcs[v][i].adj ) return i;
if(i == (G.vexnum -1)) return -1;
return -1;
}
int NextAdjVex(MGraph G,int v,int w){
int i;
for( i = w+1; i<G.vexnum; i++)
if(G.arcs[v][i].adj) return i;
if(i == (G.vexnum -1)) return -1;
return -1;
}
void CreatUDG(MGraph &G,int m, int n){
int i,j;
G.arcnum = m;
G.vexnum = m;
for(i=0;i<G.vexnum;++i)
for(j=0;j<G.vexnum;++j){
cin>>G.arcs[i][j].adj;
}
for(int i=0; i<m; i++){
G.vexs[i]=i+1;
}
return ;
}
void DFS(MGraph G,int v){
visited[v] = true;
cout<<G.vexs[v]<<" ";
for(int w = FirstAdjVex(G,v); w>=0; w = NextAdjVex(G,v,w)){
if(!visited[w]) DFS(G,w);
}
}
void DFSTraverse(MGraph G,int n){
int v;
for(v = n-1; v<G.vexnum; ++v) visited[v] = false;
for(v = n-1; v<G.vexnum; )
if(!visited[v]) DFS(G, v);
++v;
}
int main(){
int m,n;
cin>>m>>n;
MGraph G;
CreatUDG(G,m,n);
DFSTraverse(G,n);
}