使用DFS和BFS遍历不连通的图

这道题就是用DFS和BFS遍历不连通的图,把一个节点用完DFS/BFS后再DFS/BFS遍历其它的节点

今天体测1000m我跑了4分26,喜欢的女生跑了3分37,有时候挺难受的,有种使尽全力也追不上的感觉.哈哈哈,我算了一下,我 平均速度还是比她快的.有时候我举得期待的感觉很好.

这道题就是用DFS和BFS遍历不连通的图,把一个节点用完DFS/BFS后再DFS/BFS遍历其它的节点

今天体测1000m我跑了4分26,喜欢的女生跑了3分37,有时候挺难受的,有种使尽全力也追不上的感觉.哈哈哈,我算了一下,我 平均速度还是比她快的.有时候我举得期待的感觉很好.

#include<stdio.h>
#include<stdlib.h>
#define TRUE 1
#define FALSE 0
typedef struct GNode* PtrToGNode;
typedef struct ENode* PtrToENode;

typedef int Vertex;
typedef int WeightType;
typedef char DataType;
struct GNode {
	int Nv;
	int Ne;
	WeightType** G;//二维矩阵,元素为边的权重,若为无向图则权重为1
	DataType* Data;
};
struct ENode {				//每一条边都对应一个结构
	Vertex V1, V2;
	WeightType weight;

};
typedef PtrToENode Edge;
typedef PtrToGNode MyGraph;
MyGraph CreateGraph(int VertexNum);
MyGraph Build_Graph();
_Bool Visited[100];
void DFS(MyGraph Grapth, Vertex V);
void Visit(Vertex v);
void UnconnectedDFS(MyGraph Graph);

typedef int Position;
typedef struct QNode* PtrToQNode;
struct QNode {
	int* Data;
	Position Front, Rear;//头部和尾部;数组中头部对应的部分不是队列的元素.>=0&&<=MaxSize-1
	int MaxSize;//数组长度,但为了区分空和满,只存放MaxSize-1个元素
};
typedef PtrToQNode Queue;
Queue CreateQueue(int MaxSize);
_Bool AddQueue(Queue Q, int Element);
_Bool IsFull(Queue Q);
_Bool IsEmpty(Queue Q);
int DeleteQ(Queue Q);
void BFS(MyGraph Graph, Vertex S);
void UnconnectedBFS(MyGraph Graph);
int main()
{
	MyGraph a = Build_Graph();
	for (int i = 0; i < a->Nv; i++)//将所有节点设置成FALSE,以访问的设置成TRUE
	{
		Visited[i] = FALSE;
	}
	UnconnectedDFS(a);
	for (int i = 0; i < a->Nv; i++)//将所有节点设置成FALSE,以访问的设置成TRUE
	{
		Visited[i] = FALSE;
	}
	UnconnectedBFS(a);
}
MyGraph CreateGraph(int VertexNum)//创建一个图并将邻接矩阵所有节点都初始化为0
{
	MyGraph a = (MyGraph)malloc(sizeof(struct GNode));
	a->G = (WeightType**)malloc(sizeof(WeightType*) * VertexNum);//G是一个指向指针的指针
	for (int i = 0; i < VertexNum; i++)
	{
		a->G[i] = (WeightType*)malloc(sizeof(WeightType) * VertexNum);//a->G[i]是一个指向int的指针
	}
	for (int i = 0; i < VertexNum; i++)
	{
		for (int j = 0; j < VertexNum; j++)
		{
			a->G[i][j] = 0;
		}
	}
	a->Nv = VertexNum;
	a->Ne = 0;
	return a;
}
void InsertEdge(MyGraph Graph, Edge E)//创建无向图,所以G[V2][V1]也得改
{
	Graph->G[E->V1][E->V2] = 1;
	Graph->G[E->V2][E->V1] = 1;
}
MyGraph Build_Graph()
{
	int VertexNum;
	Edge E = (Edge)malloc(sizeof(struct ENode));
	scanf("%d", &VertexNum);
	MyGraph Graph = CreateGraph(VertexNum);
	scanf("%d", &Graph->Ne);
	if (Graph->Ne)
	{
		for (int i = 0; i < Graph->Ne; i++)
		{
			scanf("%d %d", &E->V1,&E->V2);
			InsertEdge(Graph, E);
		}
	}
	return Graph;

}
void Visit(Vertex v)
{
	printf("%d ", v);
}
void DFS(MyGraph Graph, Vertex V)
{

	
	printf("%d ", V);
	Visited[V] = TRUE;
	for (int i = 0; i < Graph->Nv; i++)
	{
		if (Graph->G[V][i] == 1 && Visited[i] == FALSE)
			DFS(Graph, i);
	}


}

Queue CreateQueue(int MaxSize)
{
	Queue Q = (Queue)malloc(sizeof(struct QNode));
	Q->Data = (int*)malloc(sizeof(int) * MaxSize);
	Q->Front = 0;
	Q->Rear = 0;
	Q->MaxSize = MaxSize;
	return Q;

}
_Bool IsFull(Queue Q)
{
	return(Q->Front == ((Q->Rear + 1) % Q->MaxSize));
}
_Bool AddQueue(Queue Q, int Element)
{
	if (IsFull(Q))
		return 0;
	else
	{
		Q->Rear = (Q->Rear + 1) % Q->MaxSize;
		Q->Data[Q->Rear] = Element;

		return 1;
	}
}
_Bool IsEmpty(Queue Q)
{
	return(Q->Front == Q->Rear);
}
int DeleteQ(Queue Q)
{
	if (IsEmpty(Q))
		return 0;
	else {
		Q->Front = (Q->Front + 1) % Q->MaxSize;
		return Q->Data[Q->Front];
	}
}
void BFS(MyGraph Graph,Vertex S)
{
	int Del_Node;//被删除的节点
	Queue Q = CreateQueue(Graph->Nv);
	Visit(S);//第五个节点开始
	Visited[S] = TRUE;
	AddQueue(Q, S);
	while (!IsEmpty(Q))
	{
		Del_Node = DeleteQ(Q);
		for (int i = 0; i < Graph->Nv; i++)
		{
			if (Graph->G[Del_Node][i]!=0&&Visited[i]==FALSE)
			{
				Visit(i);
				Visited[i] = TRUE;
				AddQueue(Q, i);
			}
		}


	}
}
void UnconnectedDFS(MyGraph Graph)
{
	for(int j=0;j<Graph->Nv;j++)
	{
		if (Visited[j] == FALSE)

		{
			printf("{ ");
			DFS(Graph, j);
			printf("}");
			printf("\n");

		}
	}
}
void UnconnectedBFS(MyGraph Graph)
{
	for (int j = 0; j < Graph->Nv; j++)
	{
		if (Visited[j] == FALSE)

		{
			printf("{ ");
			BFS(Graph, j);
			printf("}");
			printf("\n");

		}
	}

}

 

给定一个有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 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 }
 

 

 

 

 

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值