7-1 列出连通集
给定一个有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 }
My Answer Code:
/*
Author:Albert Tesla Wizard
Time:2020/11/2 8:56
*/
#include<bits/stdc++.h>
using namespace std;
#define MAXSIZE 50
struct Graph
{
int arcnum;
int vertexnum;
int arc[MAXSIZE][MAXSIZE];
int vertex[MAXSIZE];
};
int firstadjacent(int index,Graph G)
{
for(int i=0;i<G.vertexnum;i++)
{
if(G.arc[index][i]!=0)return i;
}
return -1;
}
int Getvertex(int index,Graph G)
{
if(index<0||index>=G.vertexnum)exit(-1);
return G.vertex[index];
}
int nextadjacent(int v,int w,Graph G)
{
for(int i=w+1;i<G.vertexnum;i++)
{
if(G.arc[v][i]!=0)return i;
}
return -1;
}
int create(Graph&G)
{
cin>>G.vertexnum>>G.arcnum;
for(int i=0;i<G.vertexnum;i++)G.vertex[i]=i;
for(int i=0;i<G.arcnum;i++)
{
int c1,c2;
cin>>c1>>c2;
if((c1<0&&c1>=G.vertexnum)||(c2<0&&c2>=G.vertexnum))exit(-1);
G.arc[c1][c2]=G.arc[c2][c1]=1;
}
}
bool visited[MAXSIZE];
int DFS(int index,Graph G)
{
visited[index]=true;
cout<<G.vertex[index]<<" ";
int index1=index;
for(index=firstadjacent(index1,G);index!=-1;index=nextadjacent(index1,Getvertex(index,G),G))
{
if(!visited[index])DFS(index,G);
}
}
int DFSTraverse(Graph G)
{
for(int i=0;i<G.vertexnum;i++)visited[i]=false;
for(int i=0;i<G.vertexnum;i++)
{
if(!visited[i])
{
cout<<"{ ";
DFS(i,G);
cout<<"}"<<'\n';
}
}
}
int BFS(Graph G)
{
queue<int>Q;
for(int i=0;i<G.vertexnum;i++)visited[i]=false;
for(int i=0;i<G.vertexnum;i++)
{
if(!visited[i])
{
Q.push(i);
visited[i]=true;
cout<<"{ ";
while(!Q.empty())
{
int k=Q.front();
Q.pop();
cout<<k<<" ";
for(int index=firstadjacent(k,G);index!=-1;index=nextadjacent(k,Getvertex(index,G),G))
{
if(!visited[index])
{
visited[index]=true;
Q.push(index);
}
}
}
cout<<"}"<<'\n';
}
}
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
Graph G;
create(G);
DFSTraverse(G);
BFS(G);
return 0;
}