日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

[DS_PRATICE]列出连通集(c语言)

發(fā)布時(shí)間:2024/1/1 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 [DS_PRATICE]列出连通集(c语言) 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

話不多說,先放題目。
給定一個(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)大?
基本思路是這樣的:

  • 建立一個(gè)圖
  • DFS和BFS(BFS需要使用隊(duì)列)
  • 以下是本人的代碼:

    #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)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。