您的位置:首页 > 其它

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空格分隔。输出格式:按照"{ v​1​​ v​2​​ ... v​k​​ }"的格式,每行输出一个连通集。先输出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"); 
}
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  pta