1. 程式人生 > >凜冬之翼---列出連通集

凜冬之翼---列出連通集

非常愉快的一次程式碼經歷,看懂思路之後,先把架構寫出來,然後從易到難,一點點的把程式碼寫出來,思路也很清晰,中間也沒有什麼卡殼的地方,感覺自己總算上路了。今天又考完了一科,去食堂喝了皮蛋瘦肉粥感覺很幸福。加油!

題目:
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; }