Description
使用图的深度遍历实现的邻接表存储结构和基本操作函数,在此基础上实现图的广度遍历算法并加以测试。注意正确使用队列存储结构。
输入格式
第一行:输入0到3之间整数(有向图:0,有向网:1,无向图:2,无向网:3); 第二行:输入顶点数和边数; 第三行:输入各个顶点的值(字符型,长度〈3);(遍历从输入的第一个顶点开始) 第四行:输入每条弧(边)弧尾和弧头(以空格作为间隔),如果是网还要输入权值;
输出格式
输出对图广度遍历的结果
输入样例
0 3 3 a b c a b b c c b
输出样例
a b c
提示
注意题目的邻接表采用头插法,也就是后出现的边节点插入到邻接表的表头。
分析:
跟深搜那道差不多,如果会深搜的话,那广搜就应该很轻松。
#include<iostream>
#include<vector>
#include<queue>
#include<algorithm>
using namespace std;
vector<int>e[30];
int v[30];
int main() {
int a;
cin>>a;
int n,m;
char ch,first;
cin>>n>>m;
for(int i=1;i<=n;++i){
cin>>ch;
}
for(int i=1;i<=m;++i){
char c1,c2;
cin>>c1>>c2;
int x,y,w;
x=c1-'a';
y=c2-'a';
if(i==1){
first=c1;
}
if(a<=1){
e[x].insert(e[x].begin(),y);
if(a==1){
cin>>w;
}
}else{
e[x].insert(e[x].begin(),y);
e[y].insert(e[y].begin(),x);
if(a==3){
cin>>w;
}
}
}
queue<int>q;
q.push(first-'a');
v[first-'a']=1;
while(!q.empty()){
int t=q.front();
q.pop();
char c;
c=t+'a';
cout<<c<<' ';
for(int i=0;i<e[t].size();++i){
if(!v[e[t][i]])
q.push(e[t][i]);
v[e[t][i]]=1;
}
}
return 0;
}