【PTA數據結構 | C語言版】列出連通集

本專欄持續輸出數據結構題目集,歡迎訂閱。

文章目錄

    • 題目
    • 代碼

題目

給定一個有 n 個頂點和 m 條邊的無向圖,請用深度優先遍歷(DFS)和廣度優先遍歷(BFS)分別列出其所有的連通集。假設頂點從 0 到 n?1 編號。進行搜索時,假設我們總是從編號最小的頂點出發,按編號遞增的順序訪問鄰接點。

輸入格式:
輸入第 1 行給出 2 個整數 n (0<n≤10) 和 m,分別是圖的頂點數和邊數。隨后 m 行,每行給出一條邊的兩個端點。每行中的數字之間用 1 空格分隔。

輸出格式:
按照"{ v1 v2 … vk}"的格式,每行輸出一個連通集。先輸出 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 }

代碼

#include <stdio.h>
#include <stdlib.h>
#include <string.h>#define MAX_VERTEX 10typedef struct Node {int vertex;struct Node* next;
} Node;typedef struct {Node* adj[MAX_VERTEX];int n;
} Graph;typedef struct {int data[MAX_VERTEX];int top;
} Stack;typedef struct {int data[MAX_VERTEX];int front, rear;
} Queue;// 函數聲明
void initGraph(Graph* g, int n);
void addEdge(Graph* g, int src, int dest);
void DFS(Graph* g, int v, int visited[], int component[], int* count);
void BFS(Graph* g, int v, int visited[], int component[], int* count);
void initQueue(Queue* q);
int isQueueEmpty(Queue* q);
void enqueue(Queue* q, int v);
int dequeue(Queue* q);
void initStack(Stack* s);
int isStackEmpty(Stack* s);
void push(Stack* s, int v);
int pop(Stack* s);
int peek(Stack* s);int main() {int n, m;scanf("%d %d", &n, &m);Graph g;initGraph(&g, n);for (int i = 0; i < m; i++) {int src, dest;scanf("%d %d", &src, &dest);addEdge(&g, src, dest);}// DFS遍歷int visited[MAX_VERTEX] = {0};for (int i = 0; i < n; i++) {if (!visited[i]) {int component[MAX_VERTEX];int count = 0;DFS(&g, i, visited, component, &count);printf("{");for (int j = 0; j < count; j++) {printf(" %d", component[j]);}printf(" }\n");}}// BFS遍歷memset(visited, 0, sizeof(visited));for (int i = 0; i < n; i++) {if (!visited[i]) {int component[MAX_VERTEX];int count = 0;BFS(&g, i, visited, component, &count);printf("{");for (int j = 0; j < count; j++) {printf(" %d", component[j]);}printf(" }\n");}}return 0;
}// 初始化圖
void initGraph(Graph* g, int n) {g->n = n;for (int i = 0; i < n; i++) {g->adj[i] = NULL;}
}// 添加無向邊(按編號遞增順序插入)
void addEdge(Graph* g, int src, int dest) {// 添加src->dest的邊(按遞增順序插入)Node* newNode = (Node*)malloc(sizeof(Node));newNode->vertex = dest;Node* prev = NULL;Node* curr = g->adj[src];while (curr != NULL && curr->vertex < dest) {prev = curr;curr = curr->next;}if (prev == NULL) {newNode->next = g->adj[src];g->adj[src] = newNode;} else {newNode->next = curr;prev->next = newNode;}// 添加dest->src的邊(按遞增順序插入)newNode = (Node*)malloc(sizeof(Node));newNode->vertex = src;prev = NULL;curr = g->adj[dest];while (curr != NULL && curr->vertex < src) {prev = curr;curr = curr->next;}if (prev == NULL) {newNode->next = g->adj[dest];g->adj[dest] = newNode;} else {newNode->next = curr;prev->next = newNode;}
}// 初始化棧
void initStack(Stack* s) {s->top = -1;
}// 判斷棧是否為空
int isStackEmpty(Stack* s) {return s->top == -1;
}// 入棧
void push(Stack* s, int v) {s->data[++(s->top)] = v;
}// 出棧
int pop(Stack* s) {return s->data[(s->top)--];
}// 獲取棧頂元素
int peek(Stack* s) {return s->data[s->top];
}// 非遞歸深度優先搜索(避免棧溢出)
void DFS(Graph* g, int v, int visited[], int component[], int* count) {Stack stack;initStack(&stack);push(&stack, v);while (!isStackEmpty(&stack)) {int u = pop(&stack);if (!visited[u]) {visited[u] = 1;component[(*count)++] = u;// 逆序處理鄰接點,確保按編號升序訪問Node* temp = g->adj[u];Node* nodes[MAX_VERTEX];int nodeCount = 0;while (temp != NULL) {nodes[nodeCount++] = temp;temp = temp->next;}for (int i = nodeCount - 1; i >= 0; i--) {int adjVertex = nodes[i]->vertex;if (!visited[adjVertex]) {push(&stack, adjVertex);}}}}
}// 初始化隊列
void initQueue(Queue* q) {q->front = q->rear = 0;
}// 判斷隊列是否為空
int isQueueEmpty(Queue* q) {return q->front == q->rear;
}// 入隊
void enqueue(Queue* q, int v) {q->data[q->rear++] = v;
}// 出隊
int dequeue(Queue* q) {return q->data[q->front++];
}// 廣度優先搜索
void BFS(Graph* g, int v, int visited[], int component[], int* count) {Queue q;initQueue(&q);visited[v] = 1;enqueue(&q, v);component[(*count)++] = v;while (!isQueueEmpty(&q)) {int u = dequeue(&q);Node* temp = g->adj[u];while (temp != NULL) {int adjVertex = temp->vertex;if (!visited[adjVertex]) {visited[adjVertex] = 1;enqueue(&q, adjVertex);component[(*count)++] = adjVertex;}temp = temp->next;}}
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/90000.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/90000.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/90000.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

GoLang教程005:switch分支

3.4 Switch分支 在 GoLand&#xff08;其實是 JetBrains 開發的 Go 編程語言 IDE&#xff09;中&#xff0c;switch 是 Go 語言&#xff08;Golang&#xff09; 的一個重要控制結構&#xff0c;用于替代多個 if-else 語句。 ? 特點說明特性說明自動 breakGo 的 switch 語句默認…

uniapp相關地圖 API調用

目錄 一、 注意事項&#xff1a; manifest.json需增加配置 二、獲取用戶收貨地址 [uni.chooseAddress] 三、獲取當前的地理位置、速度 [uni.getLocation] 四、打開地圖選擇位置、查看位置(導航) [uni.chooseLocation] [uni.openLocation] 五、使用騰訊地圖逆地址解析接口實…

Java學習----NIO模型

在 Java 的 I/O 模型中&#xff0c;NIO&#xff08;Non - Blocking I/O&#xff0c;非阻塞 I/O&#xff09;是對 BIO 的重要改進。它為高并發場景提供了更高效的處理方式&#xff0c;在眾多 Java 應用中發揮著關鍵作用。NIO模型的核心在于非阻塞和多路復用&#xff0c;其采用 “…

MySQL計數函數count原理分析

前言 統計表中數據的條數是非常常用的操作,但是咱們常用的InnoDB存儲引擎計數函數是現時統計的,所以會出現性能的問題,這次我準備分享計數函數count的原理,保證之后遇到計數方面的問題都可以輕易靈活的解決 與MyISAM存儲引擎相比,MyISAM存儲引擎是自己記錄了表中數據的條數,但…

Day07_網絡編程20250721_大項目

基本代碼&#xff1a;搭建服務器客戶端&#xff0c;要求服務器使用 epoll 模型客戶端使用多線程服務器打開數據庫&#xff0c;表單格式如下name text primary key pswd text not null客戶端做一個簡單的界面&#xff1a;1&#xff1a;注冊2&#xff1a;登錄無論注冊還是登錄&am…

20250721

P5357 【模板】AC 自動機 - 洛谷 主要是構建fail樹 /* 我們可以知道的是&#xff0c;當訪問一個點x時&#xff0c;接下來需要跳轉其fail[x]&#xff0c;以此類推&#xff0c;如果在某個fail[x]上出現了一個字符串&#xff0c;那么相應的統計次數應該加1&#xff0c;然后當訪…

【INT四則優先算式】2022-9-22

緣由ccf201903-2二十四點我用暴力破解做的&#xff0c;但是兩個程序一個拿到了滿分&#xff0c;一個拿到了50分&#xff0c;看了很長時間也沒看出問題在哪里&#xff0c;希望有英雄慧眼幫我看一下-編程語言-CSDN問答 void INT四則優先算式() {//緣由https://ask.csdn.net/ques…

本地k8s集群的搭建

windows機器&#xff0c;考慮如果使用云服務器&#xff0c;每年的開銷還是太大&#xff0c;不值得&#xff0c;自己只是做demo&#xff0c;了解各種配置和使用即可&#xff0c;使用VMware的虛擬機來搭建k8s集群 使用docker安裝rancher和k8s yum -y install chronycat > /et…

B樹、B+樹的區別及MySQL為何選擇B+樹

B樹與B樹 B樹和B樹都是自平衡的多路搜索樹&#xff0c;廣泛應用于數據庫和文件系統中&#xff0c;用于高效管理大量數據。它們的設計目標是在磁盤存儲環境下減少I/O操作次數&#xff0c;提高數據訪問效率。下面我將逐步解釋兩者的定義、特性、比較以及應用場景&#xff0c;確保…

Unity之可視化編程VisualScripting快速入門

文章目錄 前言 腳本機和狀態機 腳本圖ScriptGraph 腳本圖 子圖 自定義事件 狀態圖StateGraph 狀態圖 Start狀態 創建新狀態 過渡連接 常用功能 射線檢測 補間動畫 按鈕點擊 前言 可視化腳本使您無需編寫代碼即可為游戲或應用程序創建邏輯。可視化腳本使用基于節點的可視化圖形…

2025三掌柜贈書活動第二十五期 網絡安全應急響應實戰

目錄 前言 網絡安全的重要性 關于《網絡安全應急響應實戰》 編輯推薦 內容簡介 作者簡介 圖書目錄 《網絡安全應急響應實戰》全書速覽 結束語 前言 在當今數字化時代&#xff0c;網絡安全已經成為企業和個人都無法忽視的重要問題。隨著網絡技術的飛速發展&#xff0c;…

車載軟件架構 --- 軟件開發面臨的問題

我是穿拖鞋的漢子,魔都中堅持長期主義的汽車電子工程師。 老規矩,分享一段喜歡的文字,避免自己成為高知識低文化的工程師: 周末洗了一個澡,換了一身衣服,出了門卻不知道去哪兒,不知道去找誰,漫無目的走著,大概這就是成年人最深的孤獨吧! 舊人不知我近況,新人不知我過…

MySQL 8.0 OCP 1Z0-908 題目解析(31)

題目121 Choose two. Examine this command, which executes successfully on InnoDB Cluster: dba.dropMetadataSchema() Which two statements are true? □ A) The mysql_innodb_cluster_metadata schema is dropped from the instance where the connection was establish…

本地生活服務 app 同城信息發布系統搭建

一、邏輯分析用戶需求層面&#xff1a;對于發布者來說&#xff0c;需要一個便捷的界面來輸入同城信息&#xff0c;包括但不限于房屋租售、招聘求職、二手交易、活動推廣等各類信息。發布者要能夠上傳相關圖片、詳細描述信息內容、設置價格&#xff08;如果有需要&#xff09;、…

[Python] -項目實戰4- 利用Python進行Excel批量處理

一、為什么要批量處理Excel文件? 節省時間:人工對數十、數百個 Excel 文件重復操作不現實,Python 批量處理一次搞定。 保證一致性:統一格式、統一操作,避免手動誤差。 易于集成:可嵌入日常自動化流程,支持定時和觸發執行。 二、常用庫及選型建議 庫 作用 優勢 局限 p…

社區搜索離線回溯系統設計:架構、挑戰與性能優化|得物技術

一、項目背景在社區場景中&#xff0c;我們積累了豐富的用戶互動數據。這些歷史互動信息對CTR/CVR預估建模具有重要參考價值&#xff0c;用戶的每次互動都反映了其特定維度的偏好特征。當前&#xff0c;已在多個業務實踐中驗證&#xff0c;基于用戶歷史互動特征進行未來行為預測…

WPF——自定義ListBox

在閱讀本文前&#xff0c;最好先看看WPF——自定義RadioButton 背景 WPF中實現單選功能通常有兩種方案&#xff1a; - RadioButton組&#xff1a;傳統方案&#xff0c;但代碼冗余 - ListBox定制&#xff1a;通過樣式改造&#xff0c;兼顧數據綁定和UI靈活性 需求 一組選項中…

rancher上使用rke在華為云多網卡的服務器上安裝k8s集群問題處理了

報錯:問題&#xff1a;[[network] Host [192.168.0.213] is not able to connect to the following ports: [192.168.0.213:2379]. Please check network policies and firewall rules]問題&#xff1a; roothwy-isms-210-66:~# gotelnet 172.17.210.66 2379 map[2379:failed] …

xformers包介紹及代碼示例

文章目錄主要特性安裝方式主要優勢使用場景注意事項代碼示例xFormers是由Meta開發的一個高性能深度學習庫&#xff0c;專門用于優化Transformer架構中的注意力機制和其他組件。它提供了內存高效和計算高效的實現&#xff0c;特別適用于處理長序列和大規模模型。github地址&…

CityEngine自動化建模

CityEngine學習記錄 學習網址&#xff1a; 百度安全驗證 CityEngine-CityEngine_Rule-based_Modeling-基于規則建模和輸出模型 - 豆丁網 CityEngine 初探-CSDN博客 City Engine CGA 規則包_cga規則-CSDN博客 CityEngine學習記錄 學習網址&#xff1a;百度安全驗證 CityE…