bfs,dfs
2018-03-17 21:16
309 查看
7-9 列出连通集(25 分)给定一个有N个顶点和E条边的无向图,请用DFS和BFS分别列出其所有的连通集。假设顶点从0到N−1编号。进行搜索时,假设我们总是从编号最小的顶点出发,按编号递增的顺序访问邻接点。输入格式:输入第1行给出2个整数N(0<N≤10)和E,分别是图的顶点数和边数。随后E行,每行给出一条边的两个端点。每行中的数字之间用1空格分隔。输出格式:按照"{ v1 v2 ... vk }"的格式,每行输出一个连通集。先输出DFS的结果,再输出BFS的结果。输入样例:8 60 70 12 04 12 43 5输出样例:{ 0 1 4 2 7 }{ 3 5 }{ 6 }{ 0 1 2 7 4 }{ 3 5 }{ 6 }Dfs先设两个全局变量,一个来看点有没有访问,一个看他们关不关联。然后递归求解
int dfs(int x){
v[x]=1;//看有没有被访问
printf("%d",x);
for(inti=0;i<n;i++){
if(vis[x][i]==1&&v[i]==0){//看关不关联
dfs(i);
}
}
}
Bfs用queue来实现
int bfs(int x){
qu.push(x);
v[x]=1;
printf("%d",x);
while(!qu.empty()){
inta;
a=qu.front();
qu.pop();
for(inti=0;i<n;i++){
if(v[i]==0&&vis[a][i]==1){
printf("%d",i);
v[i]=1;
qu.push(i);
}
}
}
}
}
完整代码
#include <stdio.h>
#include <map>
#include <iostream>
#include <queue>
using namespace std;
int vis[11][11]={0},n,m;
int v[11]={0};
queue<int> qu;
int dfs(int x){
v[x]=1;
printf("%d ",x);
for(int i=0;i<n;i++){
if(vis[x][i]==1&&v[i]==0){
dfs(i);
}
}
}
int bfs(int x){
qu.push(x);
v[x]=1;
printf("%d ",x);
while(!qu.empty()){
int a;
a=qu.front();
qu.pop();
for(int i=0;i<n;i++){
if(v[i]==0&&vis[a][i]==1){
printf("%d ",i);
v[i]=1;
qu.push(i);
}
}
}
}
int main()
{
int c,d;
cin>>n>>m;
for(int i=0;i<m;i++){
cin>>c>>d;
vis[c][d]=1;
vis[d][c]=1;
}
for(int i=0;i<n;i++){
if(!v[i]){
printf("{ ");
dfs(i);
printf("}\n");
}
}
for(int i=0;i<n;i++){
v[i]=0;
}
for(int i=0;i<n;i++){
if(!v[i]){
printf("{ ");
bfs(i);
printf("}\n");
}
}
}
int dfs(int x){
v[x]=1;//看有没有被访问
printf("%d",x);
for(inti=0;i<n;i++){
if(vis[x][i]==1&&v[i]==0){//看关不关联
dfs(i);
}
}
}
Bfs用queue来实现
int bfs(int x){
qu.push(x);
v[x]=1;
printf("%d",x);
while(!qu.empty()){
inta;
a=qu.front();
qu.pop();
for(inti=0;i<n;i++){
if(v[i]==0&&vis[a][i]==1){
printf("%d",i);
v[i]=1;
qu.push(i);
}
}
}
}
}
完整代码
#include <stdio.h>
#include <map>
#include <iostream>
#include <queue>
using namespace std;
int vis[11][11]={0},n,m;
int v[11]={0};
queue<int> qu;
int dfs(int x){
v[x]=1;
printf("%d ",x);
for(int i=0;i<n;i++){
if(vis[x][i]==1&&v[i]==0){
dfs(i);
}
}
}
int bfs(int x){
qu.push(x);
v[x]=1;
printf("%d ",x);
while(!qu.empty()){
int a;
a=qu.front();
qu.pop();
for(int i=0;i<n;i++){
if(v[i]==0&&vis[a][i]==1){
printf("%d ",i);
v[i]=1;
qu.push(i);
}
}
}
}
int main()
{
int c,d;
cin>>n>>m;
for(int i=0;i<m;i++){
cin>>c>>d;
vis[c][d]=1;
vis[d][c]=1;
}
for(int i=0;i<n;i++){
if(!v[i]){
printf("{ ");
dfs(i);
printf("}\n");
}
}
for(int i=0;i<n;i++){
v[i]=0;
}
for(int i=0;i<n;i++){
if(!v[i]){
printf("{ ");
bfs(i);
printf("}\n");
}
}
}
相关文章推荐
- PAT (Advanced Level) 1091. Acute Stroke (30) 3维DFS(10M数据时栈溢出)、3维BFS(AC)
- 【bzoj4296】【PA2015】【Mistrzostwa】【bfs+dfs】
- lightOJ 1426 Blind Escape(BFS DFS 哈希)
- 图的基本操作:建立图,DFS,BFS-06-图1 列出连通集
- 【图算法】(2)DFS和BFS
- Rescue 3解法:(1.DFS 2. BFS 3.BFS+优先队列模板)
- CH Round #72树洞[二分答案 DFS&&BFS]
- DFS和BFS搜索
- DFS BFS 搜索总结
- hdu 1728 逃离迷宫 (论DFS思想在BFS中的应用)
- POJ - 3984 迷宫问题(BFS、DFS)
- POJ 2227 The Wedding Juicer (优先级队列+bfs+dfs)
- NYU AI作业习题-活动安排问题 BFS+DFS Iterative deepening depth-first search
- bfs+bfs/dfs hdu 1254 推箱子1
- 图的遍历——BFS和DFS
- 2138 图结构练习——BFSDFS——判断可达性
- 图结构练习——BFSDFS——判断可达性
- HPU DFS + BFS 专项练习A - Red and Black HDU - 1312
- POJ-3083 Children of the Candy Corn (BFS+DFS)
- SDUT 2138 图结构练习——BFSDFS——判断可达性