给定一个有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 }
结尾无空行
#include <iostream>
#include <stdbool.h>
#define Max 100
using namespace std;
bool visited[Max];
typedef struct ArcNode{
int adjvex;
struct ArcNode * nexttarc;
}ArcNode;
typedef struct Vnode{
int data;
ArcNode * firctarc;
}VNode,AdjList[Max];
typedef struct {
AdjList vertices;
int vexnum,arcnum;
}AlGraph;
void VisitFunc(AlGraph G,int v){
cout<<G.vertices[v].data<<" ";
}
void DFS(AlGraph &G,int v){
ArcNode *p;
if(v<0||v>G.vexnum)
return;
else{
visited[v]=true;
p=G.vertices[v].firctarc;
VisitFunc(G,v);
while(p!=NULL){
if(visited[p->adjvex]!=true)
DFS(G,p->adjvex);
p=p->nexttarc;
}
}
}
void DFSTreaverse(AlGraph &G){
int v;
for(v=0;v<G.vexnum;v++)
visited[v]=false;
for(v=0;v<G.vexnum;++v){
if(!visited[v]){
cout<<"{ ";
DFS(G,v);
cout<<"}"<<endl;
}
}
}
void BFS(AlGraph &G,int v){
int que[Max];int front=0;int rear=0;//队列
int j;ArcNode *p=new ArcNode;
VisitFunc(G,v);
visited[v]=true;
rear++;
que[rear]=v;
while(front!=rear){
front++;
j=que[front];
p=G.vertices[j].firctarc;
while(p!=NULL){
if(visited[p->adjvex]==false){
cout<<p->adjvex<<" ";
visited[p->adjvex]=true;
rear++;
que[rear]=p->adjvex;
}
p=p->nexttarc;
}
}
}
void BFSTreaverse(AlGraph &G){
int v;
for(v=0;v<G.vexnum;v++)
visited[v]=false;
for(v=0;v<G.vexnum;++v){
if(!visited[v]){
cout<<"{ ";
BFS(G,v);
cout<<"}"<<endl;
}
}
}
int Position(AlGraph &G,int c){
for(int i=0;i<G.vexnum;i++){
if(G.vertices[i].data==c)
return i;
}
return -1;
}
void CreatGraph(AlGraph &G){
cin>>G.vexnum>>G.arcnum;
for(int i=0;i<G.vexnum;i++){
G.vertices[i].data=i;
G.vertices[i].firctarc=NULL;
}
for(int i=0;i<G.arcnum;i++){
int c1,c2;
cin>>c1>>c2;
int j=Position(G,c1);
int k=Position(G,c2);
ArcNode *p=new ArcNode;
ArcNode *p_pre=new ArcNode;
ArcNode *p1=new ArcNode;
p1->adjvex=k;
p=G.vertices[j].firctarc;
p_pre=p;
if(p==NULL){
G.vertices[j].firctarc=p1;
p1->nexttarc=p;
}else{
while((p1->adjvex)>(p->adjvex)){
p_pre=p;
p=p->nexttarc;
if(p==NULL) break;
}
if(p==G.vertices[j].firctarc){
p1->nexttarc=G.vertices[j].firctarc;
G.vertices[j].firctarc=p1;
}else{
p1->nexttarc=p_pre->nexttarc;
p_pre->nexttarc=p1;
}//else
}//else
ArcNode *p2=new ArcNode;
p2->adjvex=j;
p=G.vertices[k].firctarc;
p_pre=p;
if(p==NULL){
G.vertices[k].firctarc=p2;
p2->nexttarc=p;
}else{
while((p2->adjvex)>(p->adjvex)){
p_pre=p;
p=p->nexttarc;
if(p==NULL) break;
}
if(p==G.vertices[k].firctarc){
p2->nexttarc=G.vertices[k].firctarc;
G.vertices[k].firctarc=p2;
}else{
p2->nexttarc=p_pre->nexttarc;
p_pre->nexttarc=p2;
}//else
}//else
}
}
int main()
{
AlGraph G;
CreatGraph(G);
DFSTreaverse(G);
BFSTreaverse(G);
return 0;
}
运行结果