Description
按照给定的起始顶点广度优先遍历图,每一次通过字母顺序选择顶点查找下一层邻接点,打印遍历顺序。
Input
输入第一行为测试用例个数,后面每一个用例用多行表示,用例第一行是节点个数n和开始顶点,用空格隔开,后面n+1行为图的邻接矩阵,其中第一行为节点名称。值之间使用空格隔开。
Output
输出遍历顺序,用空格隔开
Sample Input 1
1
4 a
a b c d
a 0 1 1 0
b 1 0 1 0
c 1 1 0 1
d 0 0 1 0
Sample Output 1
a b c d
#include <queue>
#include <iostream>
#include<algorithm>
#define MAX_NUM 100
using namespace std;
int n;
int matrix[500+5][500+5];
char path[500+5];
int ans=-1,cnt;
int vis[500+5];
void bfs(int a){
queue<int> qu;
qu.push(a);
int te;
while(!qu.empty()){
te = qu.front();
for(int i=0;i<n;i++){
if(!vis[i]&&matrix[te][i]==1&&i>te){
vis[i]=1;
qu.push(i);
path[cnt++]=i+97;
}
}
qu.pop();
}
}
int main() {
int t;
cin>>t;
while(t-->0){
cin>>n;
char start;
int s;
cin>>start;
char node[n];
for(int i=0;i<n;i++) {
cin>>node[i];
if(node[i]==start)
s = i;
}
char rowTag;
for(int i=0;i<n;i++){
cin>>rowTag;
vis[i]=0;
for(int j=0;j<n;j++){
cin>>matrix[i][j];
matrix[j][i]=matrix[i][j];//无向图
}
}
path[0]=start;
cnt=1;
vis[s]=1;
bfs(s);
for(int i=0;i<cnt;i++)
cout<<path[i]<<" ";//算上开始的点
cout<<endl;
}
return 0;
}