本方法皆用vector进行邻接表模拟
7-1 图的先深搜索
作者 唐艳琴
单位 中国人民解放军陆军工程大学
输出无向图的给定起点的先深序列。
输入格式:
输入第一行给出三个正整数,分别表示无向图的节点数N(1<N≤10)、边数M(≤50)和探索起始节点编号S(节点从1到N编号)。
随后的M行对应M条边,每行给出一对正整数,分别是该条边直接连通的两个节点的编号。
输出格式:
输出从S开始的无向图的先深搜索序列,用一个空格隔开,最后也有一个空格;如果为非连通图,再在结尾处另起一行输出一个0,表示此图非连通。
由于深度优先遍历的节点序列是不唯一的,为了使得输出具有唯一的结果,我们约定以表头插入法构造邻接表。
输入样例1:
6 8 2
1 2
2 3
3 4
4 5
5 6
6 4
3 6
1 5
输出样例1:
2 3 6 4 5 1
输入样例2:
4 3 1
1 2
2 3
3 1
输出样例1:
1 3 2
0
#include<bits/stdc++.h>
using namespace std;
int n,m,s,a,b,cnt;
vector<int>road[15];
bool check[15];
void dfs(int now){
check[now]=true;
cout<<now<<" ";
cnt++;
for(int i=road[now].size()-1;i>=0;--i){
if(!check[road[now][i]]){
dfs(road[now][i]);
}
}
}
int main(){
cin>>n>>m>>s;
while(m--){
cin>>a>>b;
road[a].push_back(b);
road[b].push_back(a);
}
dfs(s);
cout<<(cnt==n?"":"\n0");
}
7-2 图的先广搜索
作者 唐艳琴
单位 中国人民解放军陆军工程大学
输出无向图的给定起点的先广序列。
输入格式:
输入第一行给出三个正整数,分别表示无向图的节点数N(1<N≤10)、边数M(≤50)和探索起始节点编号S(节点从1到N编号)。
随后的M行对应M条边,每行给出一对正整数,分别是该条边直接连通的两个节点的编号。
输出格式:
输出从S开始的无向图的先广搜索序列,用一个空格隔开,最后也有一个空格;如果为非连通图,再在结尾处另起一行输出一个0,表示此图非连通。
由于广度优先遍历的节点序列是不唯一的,为了使得输出具有唯一的结果,我们约定以表头插入法构造邻接表。
输入样例:
6 8 2
1 2
2 3
3 4
4 5
5 6
6 4
3 6
1 5
输出样例:
2 3 1 6 4 5
#include<bits/stdc++.h>
using namespace std;
int n,m,s,a,b,cnt;
vector<int>road[15];
bool check[15];
queue<int>q;
void bfs(int begin){
q.push(begin);
while(!q.empty()){
begin=q.front();q.pop();
if(check[begin]) continue;
cout<<begin<<" ";check[begin]=true;cnt++;
for(int i=road[begin].size()-1;i>=0;--i){
q.push(road[begin][i]);
}
}
}
int main(){
cin>>n>>m>>s;
while(m--){
cin>>a>>b;
road[a].push_back(b);
road[b].push_back(a);
}
bfs(s);
cout<<(cnt==n?"":"\n0");
}