我的GIS/CS学习笔记:https://github.com/yunwei37/ZJU-CS-GIS-ClassNotes <一个浙江大学本科生的计算机、地理信息科学知识库 > 还有不少数据结构和算法相关的笔记以及pta题解哦x
给定一个有N个顶点和E条边的无向图,请用DFS和BFS分别列出其所有的连通集。假设顶点从0到N−1编号。进行搜索时,假设我们总是从编号最小的顶点出发,按编号递增的顺序访问邻接点。
输入格式:
输入第1行给出2个整数N(0<N≤10)和E,分别是图的顶点数和边数。随后E行,每行给出一条边的两个端点。每行中的数字之间用1空格分隔。
输出格式:
按照"{ v1 v2 … vk }"的格式,每行输出一个连通集。先输出DFS的结果,再输出BFS的结果。
输入样例:
8 6 0 7 0 1 2 0 4 1 2 4 3 5
输出样例:
{ 0 1 4 2 7 } { 3 5 } { 6 } { 0 1 2 7 4 } { 3 5 } { 6 }
代码语言:javascript复制#include<iostream>
#include<list>
using namespace std;
int edge[10][10]={0};
int v[10];
int visit[10]={0};
//dfs
int dfs(int v1,int n){
int count=1,i;
cout<<v1<<" ";
v[v1]=0;
for(i=0;i<n; i){
if(edge[v1][i]&&v[i])
count =dfs(i,n);
}
return count;
}
//bfs
int bfs(int v1,int n){
list<int> a;
int count=1,i,x;
cout<<v1<<" ";
v[v1]=0;
visit[v1]=0;
for(i=0;i<n; i)
if(edge[v1][i])
a.push_back(i),visit[i]=0;
while(!a.empty()){
x=*a.begin();
a.pop_front();
cout<<x<<" ";
v[x]=0;
count;
for(i=0;i<n; i){
if(edge[x][i]&&v[i]&&visit[i])
a.push_back(i),visit[i]=0;
}
}
return count;
}
int main(){
int n,e,n1;
int i,e1,e2;
cin>>n>>e;
for(i=0;i<e; i){
cin>>e1>>e2;
edge[e1][e2]=1;
edge[e2][e1]=1;
}
//dfs
for(i=0;i<n;i )
v[i]=1;
n1=n;
cout<<"{ ";
n1=n1-dfs(0,n);
cout<<"}"<<endl;
while(n1>0){
i=0;
while(!v[i])
i;
cout<<"{ ";
n1-=dfs(i,n);
cout<<"}"<<endl;
}
//bfs
for(i=0;i<n; i)
visit[i]=1;
for(i=0;i<n;i )
v[i]=1;
n1=n;
cout<<"{ ";
n1=n1-bfs(0,n);
cout<<"}"<<endl;
while(n1>0){
i=0;
while(!v[i])
i;
cout<<"{ ";
n1-=bfs(i,n);
cout<<"}"<<endl;
}
return 0;
}