凛冬之翼---列出连通集

非常愉快的一次代码经历,看懂思路之后,先把架构写出来,然后从易到难,一点点的把代码写出来,思路也很清晰,中间也没有什么卡壳的地方,感觉自己总算上路了。今天又考完了一科,去食堂喝了皮蛋瘦肉粥感觉很幸福。加油!

题目:
06-图1 列出连通集 (25分)

给定一个有NN个顶点和EE条边的无向图,请用DFS和BFS分别列出其所有的连通集。假设顶点从0到N-1N−1编号。进行搜索时,假设我们总是从编号最小的顶点出发,按编号递增的顺序访问邻接点。

输入格式:
输入第1行给出2个整数NN(0<N\le 100<N≤10)和EE,分别是图的顶点数和边数。随后EE行,每行给出一条边的两个端点。每行中的数字之间用1空格分隔。

输出格式:
按照"{ v_1v
​1
​​ v_2v
​2
​​ … v_kv
​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.主要考察的是DFS和BFS的运算。DFS主要思想是递归,一直递归到连接数的尽头然后返回上一层,如果上一层有数就继续递归直到返回到最初的地方就是算递归完成。BFS的主要思想是队列,建立一个队列来存放数,当一个数出队的时候把与它相关的所有没有访问过的数全部放到队列里去,只要队列不为空就一直持续这个操作。
2.在数据结构方面主要是利用一个矩阵来表示图,用一个数轴来表示数字有没有被访问过非常的巧妙。

代码:

#include<stdio.h>
#include<stdlib.h>
#include<queue>
using namespace std;

#define MAX 15

int visit[MAX]={0};
int G[MAX][MAX]={0},point,side;

void BuildMap(){
	scanf("%d %d",&point,&side);   //get point and side from first line
	int i,v,f;
	for(i=0;i<side;i++){
		scanf("%d %d",&v,&f);
		G[v][f]=1;                 //please make sure a ligature have two points to make it 1
		G[f][v]=1;
	}
}

void DFS(int i){
	printf("%d ",i);
	visit[i]=1;
	for(int j=0;j<point;j++){
		if(!visit[j]&&G[i][j]) {  //if the point isn't visited and point is exist
		DFS(j); 
	}
}
}


void ListDFS(){          //printf numbers using DFS
	int i;
	for(i=0;i<point;i++){
		if(!visit[i]){
			printf("{ ");
			DFS(i);
			printf("}\n");
		}
	}
}

void ClearVisit(){       // make every element is 0
	int i;
	for(i=0;i<point;i++){
		visit[i]=0;
	}
}

void BFS(int i){
	queue<int> q;                //ask for a queue
    visit[i]=1;
	q.push(i);
	while(!q.empty()){
		int de=q.front();        //de present the first one of the queue
		printf("%d ",de); //printf the first one of the queue
		q.pop();                //delete the first one of the queue
	    for(int j=0;j<point;j++){
	    	if(!visit[j]&&G[de][j])  //let all the points lining with i into the queue
	    	{
	    		visit[j]=1;
	    		q.push(j);
			}
		}	
	}
	
}

void ListBFS(){                  //printf numbers using BFS
	int i;
	for(i=0;i<point;i++){
		if(!visit[i]){
			printf("{ ");
			BFS(i);
			printf("}\n");
		}
	}
}



int main(){
	BuildMap();    //build a matrix to save the numbers
	ListDFS();     //using DFS to printf all the numbers
	ClearVisit();  //clear the visit[] to pepare for next function
	ListBFS();     //using BFS to printf all the numbers
	return 0;
} 

猜你喜欢

转载自blog.csdn.net/weixin_39042981/article/details/83998184
今日推荐