【PTA數據結構 | C語言版】強連通分量

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

文章目錄

    • 題目
    • 代碼

題目

本題請你編寫程序,輸出給定有向圖中的各個強連通分量,并統計強連通分量的個數。

輸入格式:
輸入首先在第一行給出 2 個整數,依次為有向圖的頂點數 n(0<n≤15)和邊數 m。
隨后 m 行,每行給出一條有向邊的起點和終點編號。編號從 0 開始,其間以 1 個空格分隔。

輸出格式:
按照 { v1 v2 … vk } 的格式,每行輸出一個強連通分量中的所有頂點 v1~vk 的編號。最后一行輸出強連通分量的個數。

輸入樣例:
4 5
0 1
1 3
3 0
2 1
2 3

輸出樣例:
{ 0 1 3 }
{ 2 }
2

注意:強連通分量的輸出順序是不唯一的,以任何順序輸出都可以,有特殊裁判程序判斷輸出的正確性。例如下列輸出也是正確的。

{ 2 }
{ 1 3 0 }
2

代碼

#include <stdio.h>
#include <stdlib.h>
#include <string.h>#define MAX_VERTEX 15typedef struct Node {int vertex;struct Node* next;
} Node;typedef struct {Node* adj[MAX_VERTEX];int n;
} Graph;// 棧結構用于DFS順序記錄
typedef struct {int data[MAX_VERTEX];int top;
} Stack;// 函數聲明
void initGraph(Graph* g, int n);
void addEdge(Graph* g, int src, int dest);
Graph getTranspose(Graph* g);
void DFSUtil(Graph* g, int v, int visited[], Stack* stack);
void fillOrder(Graph* g, int visited[], Stack* stack);
void printSCCs(Graph* g);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);}printSCCs(&g);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) {Node* newNode = (Node*)malloc(sizeof(Node));newNode->vertex = dest;newNode->next = g->adj[src];g->adj[src] = newNode;
}// 獲取圖的轉置(所有邊反向)
Graph getTranspose(Graph* g) {Graph transpose;initGraph(&transpose, g->n);for (int v = 0; v < g->n; v++) {Node* temp = g->adj[v];while (temp != NULL) {addEdge(&transpose, temp->vertex, v);temp = temp->next;}}return transpose;
}// 初始化棧
void initStack(Stack* s) {s->top = -1;
}// 入棧
void push(Stack* s, int v) {s->data[++(s->top)] = v;
}// 出棧
int pop(Stack* s) {return s->data[(s->top)--];
}// 判斷棧是否為空
int isEmpty(Stack* s) {return s->top == -1;
}// 深度優先搜索輔助函數
void DFSUtil(Graph* g, int v, int visited[], Stack* stack) {visited[v] = 1;Node* temp = g->adj[v];while (temp != NULL) {int adjVertex = temp->vertex;if (!visited[adjVertex]) {DFSUtil(g, adjVertex, visited, stack);}temp = temp->next;}// 記錄頂點完成時間(壓棧)if (stack != NULL) {push(stack, v);} else {// 直接輸出SCC成員(第二次DFS)printf("%d ", v);}
}// 填充頂點處理順序(第一次DFS)
void fillOrder(Graph* g, int visited[], Stack* stack) {for (int i = 0; i < g->n; i++) {if (!visited[i]) {DFSUtil(g, i, visited, stack);}}
}// 打印所有強連通分量
void printSCCs(Graph* g) {Stack stack;initStack(&stack);int visited[MAX_VERTEX];memset(visited, 0, sizeof(visited));// 第一次DFS,記錄頂點處理順序fillOrder(g, visited, &stack);// 獲取圖的轉置Graph transpose = getTranspose(g);// 重置訪問標記memset(visited, 0, sizeof(visited));int count = 0; // 強連通分量計數器// 第二次DFS,處理轉置圖while (!isEmpty(&stack)) {int v = pop(&stack);if (!visited[v]) {printf("{ ");DFSUtil(&transpose, v, visited, NULL);printf("}\n");count++;}}printf("%d\n", count); // 輸出強連通分量個數
}    

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

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

相關文章

idea部署新項目時,用自定義的maven出現的問題解決

出現這個問題是因為maven版本和idea版本不兼容&#xff0c;例如圖示是maven3.9和idea2021.3的版本不兼容&#xff0c;maven換成3.8.x即可解決

OCR 身份識別:讓身份信息錄入場景更高效安全

在銀行柜臺開戶、線上平臺實名認證等場景中&#xff0c;身份信息錄入是基礎環節&#xff0c;OCR 身份識別產品正成為提升效率與安全性的關鍵。?傳統人工錄入身份證信息&#xff0c;不僅耗時久&#xff0c;還易因手誤導致姓名、號碼出錯&#xff0c;影響業務辦理進度。而 OCR 身…

Web 服務器和Web 中間件

一、什么是 Web 中間件 Web 中間件&#xff08;Web Middleware&#xff09;是運行在 Web 服務器與實際業務程序之間的一層“膠水”軟件&#xff0c;用來統一處理公共事務&#xff0c;讓開發者專注寫業務邏輯。常見職責&#xff1a; 請求/響應攔截&#xff08;鑒權、日志、跨域、…

Paimon的部分更新以及DeleteVector實現

背景 本文基于 Paimon 0.9 出于對與Paimon內部的DeleteVctor的實現以及部分更新的實現進行的源碼閱讀。 關于 DeleteVector的介紹可以看這里 說明 對于Paimon來說無論是Spark中使用還是Flink使用&#xff0c;后面的邏輯都是一樣的&#xff0c;所以我們以Spark為例來說。所以…

Redis 的事務機制是怎樣的?

Redis 的事務機制 Redis支持事務機制,其主要目的是確保多個命令執行的原子性,即這些命令會作為一個不可分割的操作單元執行。 需要注意的是,Redis事務不支持回滾操作。從Redis 2.6.5版本開始,服務器會在命令累積階段檢測錯誤。在執行EXEC命令時,若發現錯誤則會拒絕執行事…

網安學習NO.17

1. VPN 概述定義&#xff1a;在公用網絡&#xff08;如 Internet、幀中繼、ATM 等&#xff09;中&#xff0c;通過技術手段虛擬出的一條企業內部專線&#xff0c;能像私有網絡一樣提供安全性、可靠性和可管理性。核心特征&#xff1a;利用公共網絡構建&#xff0c;具備 “虛擬性…

MCU芯片AS32S601在衛星光纖放大器(EDFA)中的應用探索

摘要&#xff1a;本文聚焦于國科安芯推出的AS32S601型MCU芯片在衛星光纖放大器&#xff08;EDFA&#xff09;中的潛在應用&#xff0c;探討其技術特性、抗輻射性能及適用性。通過分析其在單粒子效應脈沖激光試驗中的表現&#xff0c;結合EDFA系統對控制芯片的要求&#xff0c;評…

Hexo - 免費搭建個人博客02 - 創建個人博客

導言我的博客&#xff1a;https://q164129345.github.io/ 開始一步一步地完成博客的創建。 一、初始化Hexo博客以上所示&#xff0c;運行以下指令在myCode文件夾里初始化一個hexo博客。 hexo init myblog二、安裝依賴如上所示&#xff0c;完成依賴的安裝。 cd myblog npm insta…

單片機-----基礎知識整合

一、基礎知識1&#xff09;單片機的組成&#xff1a;中央處理器CPU、隨機存儲器RAM、只讀存儲器ROM、定時器、多種I/O接口、中斷系統等2&#xff09;STM32U575RIT6采用ARM Cortex-M33內核架構ARM是什么&#xff1f;①ARM是一家公司&#xff0c;ARM公司是一家芯片知識產權&#…

雙流join 、 Paimon Partial Update 和 動態schema

背景 Paimon 通過其獨特的 partial-update 合并引擎和底層的 LSM 存儲結構&#xff0c;巧妙地將傳統雙流 Join 中對 Flink State 的高頻隨機讀/寫&#xff0c;轉換為了對 Paimon 表的順序寫和后臺的高效合并&#xff0c;從而一站式地解決了 Flink 作業狀態過大、依賴外部 KV 系…

7.3.1 進程調度機制那些事兒

一&#xff1a;task_struct結構體分析 1、進程有兩種特殊形式&#xff1a;沒有用戶虛擬地址空間的進程叫內核線程&#xff0c;共享用戶虛擬地址空間的進程叫作用戶線程。共享同一個用戶虛擬地址空間的所有用戶線程叫線程組。 C語言標準庫進程 Linux內核進程 …

基于多種機器學習的水質污染及安全預測分析系統的設計與實現【隨機森林、XGBoost、LightGBM、SMOTE、貝葉斯優化】

文章目錄有需要本項目的代碼或文檔以及全部資源&#xff0c;或者部署調試可以私信博主項目介紹總結每文一語有需要本項目的代碼或文檔以及全部資源&#xff0c;或者部署調試可以私信博主 項目介紹 隨著工業化和城市化的不斷推進&#xff0c;水質污染問題逐漸成為影響生態環境…

Linux第三天Linux基礎命令(二)

1.grep命令可以通過grep命令&#xff0c;從文件中通過關鍵字過濾文件行。grep [-n] 關鍵字 文件路徑選項-n&#xff0c;可選&#xff0c;表示在結果中顯示匹配的行的行號。參數&#xff0c;關鍵字&#xff0c;必填&#xff0c;表示過濾的關鍵字&#xff0c;帶有空格或其它特殊符…

Linux Debian操作系統、Deepin深度操作系統手動分區方案參考

以下是Linux Debian操作系統、Deepin深度操作系統安裝過程中手動分區的建議&#xff0c;按UEFI、swap、boot、根分區、home分區劃分&#xff0c;以下是詳細的分區配置參考建議&#xff1a; 一、手動分區方案&#xff08;UEFI模式&#xff09;分區名稱分區類型大小建議掛載點文件…

jmeter如何做自動化接口測試?

全網最全流程&#xff01;JmeterAntAllureJenkins搭建屬于你的接口自動化流水線&#xff0c;CI/CD直接起飛&#xff01;1.什么是jmeter&#xff1f; JMeter是100%完全由Java語言編寫的&#xff0c;免費的開源軟件&#xff0c;是非常優秀的性能測試和接口測試工具&#xff0c;支…

MyBatis整合SpringBoot終極指南

以下是一份系統化的 ?MyBatis 整合 Spring Boot 學習筆記&#xff0c;結合官方文檔與最佳實踐整理&#xff0c;涵蓋配置、核心功能、實戰示例及常見問題解決。 一、整合基礎與依賴配置 1. ?核心依賴? 在 pom.xml 中添加&#xff1a; <dependency><groupId>or…

企業微信ipad協議接口解決方案最新功能概覽

支持最新版本企業微信&#xff0c;安全穩定0封號免費試用&#xff0c;技術支持&#xff1a;string wechat"Mrzhu0107"企微ipad協議接口最新功能升級如下&#xff1a;【初始化】初始化企業微信&#xff0c;設置消息回調地址&#xff0c;獲取運行中的實例&#xff0c;根…

ansible 批量 scp 和 load 鏡像

1、save 鏡像腳本 在本地保存鏡像到 ansible 代碼目錄的腳本。 1.1、使用說明: 保存單個鏡像 save -i gcr.io/cadvisor/cadvisor:v0.52.1保存某個 namespace 下的所有鏡像 save1.2、腳本內容 cat /usr/local/bin/save #!/bin/bash #set -e # 分隔符 str="-"# …

【C# in .NET】20. 探秘靜態類:抽象與密封的結合體

探秘靜態類:抽象與密封的結合體 一、靜態類的底層本質:抽象與密封的結合體 靜態類作為 C# 中特殊的類型形式,其底層實現融合了抽象類與密封類的特性,形成了不可實例化、不可繼承的類型約束。 1. IL 層面的靜態類標識 定義一個簡單的靜態類: public static class Stri…

【Vue3】ECharts圖表案例

官方參考&#xff1a;Examples - Apache ECharts 1、創建工程 npm create vitelatest 或 npm init vuelatest 設置如下 2、下載依賴集運行項目 cd vue-echarts-demo npm install npm install echarts npm run dev 3、編寫核心代碼 創建src\components\BarView.vue文件…