[DS_PRATICE]列出连通集(c语言)
話不多說,先放題目。
給定一個(gè)有N個(gè)頂點(diǎn)和E條邊的無向圖,請用DFS和BFS分別列出其所有的連通集。假設(shè)頂點(diǎn)從0到N?1編號。進(jìn)行搜索時(shí),假設(shè)我們總是從編號最小的頂點(diǎn)出發(fā),按編號遞增的順序訪問鄰接點(diǎn)。
輸入格式:
輸入第1行給出2個(gè)整數(shù)N(0<N≤10)和E,分別是圖的頂點(diǎn)數(shù)和邊數(shù)。隨后E行,每行給出一條邊的兩個(gè)端點(diǎn)。每行中的數(shù)字之間用1空格分隔。
輸出格式:
按照"{ v1 v2… vk }"的格式,每行輸出一個(gè)連通集。先輸出DFS的結(jié)果,再輸出BFS的結(jié)果。
輸入樣例:
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 }
這道題其實(shí)非常簡單,但是代碼量稍微有點(diǎn)大?
基本思路是這樣的:
以下是本人的代碼:
#include<stdio.h> #include<stdlib.h>#define MaxVertexNum 10typedef struct VNode{int Nv,Ne;int G[MaxVertexNum][MaxVertexNum]; }MGraph;typedef struct queue{int Front;int Rear;int* a;int Capacity;int Size; }Queue;MGraph* CreateGraph(int VertexNum); void Insert(MGraph* M,int V1,int V2); Queue* CreateQueue(int N); void EnQueue(Queue* Q,int V); int DeQueue(Queue* Q); void DFS(MGraph* M,int V); void BFS(MGraph* M,Queue* Q,int V);static int DVisited[10]; static int BVisited[10];int main(void) {int N,E;int V1,V2;MGraph* M;Queue* Q;scanf("%d%d",&N,&E);/* 創(chuàng)建圖 */M = CreateGraph(N);/* 為了BFS創(chuàng)建隊(duì)列 */Q = CreateQueue(N);for(int i = 0;i < E;i++){scanf("%d%d",&V1,&V2);Insert(M,V1,V2);}/* 遍歷圖DFS */for(int i = 0;i < M->Nv;i++){if(!DVisited[i]){printf("{ ");DFS(M,i);printf("}\n");} }for(int i = 0;i < M->Nv;i++){if(!BVisited[i]){printf("{ ");BFS(M,Q,i);printf("}\n");} }system("pause"); }void DFS(MGraph* M,int V) {DVisited[V] = 1;printf("%d ",V);for(int i = 0;i < M->Nv;i++){if(M->G[V][i]&&!DVisited[i]){DFS(M,i);}} }void BFS(MGraph* M,Queue* Q,int V) {EnQueue(Q,V);BVisited[V] = 1;printf("%d ",V);while(Q->Size != 0){V = DeQueue(Q);for(int i = 0;i < M->Nv;i++){if(!BVisited[i]&&M->G[V][i]){BVisited[i] = 1;printf("%d ",i);EnQueue(Q,i);}}} }Queue* CreateQueue(int N) {Queue* Q;Q = (Queue*)malloc(sizeof(Queue));Q->Front = 0;Q->Rear = 0;Q->a = (int*)malloc(sizeof(int)*N);Q->Capacity = N;Q->Size = 0;return Q; }void EnQueue(Queue* Q,int V) { Q->Size++;Q->a[Q->Rear] = V;Q->Rear = ++Q->Rear % Q->Capacity; }int DeQueue(Queue* Q) {int temp;temp = Q->a[Q->Front];Q->Front = ++Q->Front % Q->Capacity;Q->Size--;return temp; }MGraph* CreateGraph(int VertexNum) {MGraph* M;int V,W;M = (MGraph*)malloc(sizeof(MGraph));M->Ne = 0;M->Nv = VertexNum;for(V = 0;V < VertexNum;V++)for(W = 0; W < VertexNum;W++)M->G[V][W] = 0;return M; }void Insert(MGraph* M,int V1,int V2) {M->G[V1][V2] = 1;M->G[V2][V1] = 1; }這題也沒有去參考網(wǎng)上其他人的答案,雖然這題很簡單,但我還是有點(diǎn)驕傲的。當(dāng)然我也有一些不嚴(yán)謹(jǐn)?shù)牡胤?#xff0c;比如隊(duì)列的判空判滿。
總結(jié)
以上是生活随笔為你收集整理的[DS_PRATICE]列出连通集(c语言)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 基于4G网卡和树莓派zero实现低延时数
- 下一篇: Promise 对象循环调用