代碼隨想錄Day71(圖論Part07)

53.尋寶

題目:53. 尋寶(第七期模擬筆試) (kamacoder.com)

思路:首先,我不知道怎么存這樣的東西,用三維數組嗎,沒搞懂,果斷放棄

prim算法實現
import java.util.*;class Main {public static void main(String[] args) {Scanner scanner = new Scanner(System.in);int v = scanner.nextInt();int e = scanner.nextInt();// 填一個默認最大值,題目描述val最大為10000int[][] grid = new int[v + 1][v + 1];for (int i = 1; i <= v; i++) {Arrays.fill(grid[i], 10001);}for (int i = 0; i < e; i++) {int x = scanner.nextInt();int y = scanner.nextInt();int k = scanner.nextInt();// 因為是雙向圖,所以兩個方向都要填上grid[x][y] = k;grid[y][x] = k;}// 所有節點到最小生成樹的最小距離int[] minDist = new int[v + 1];Arrays.fill(minDist, 10001);// 這個節點是否在樹里boolean[] isInTree = new boolean[v + 1];// 我們只需要循環 n-1次,建立 n - 1條邊,就可以把n個節點的圖連在一起for (int i = 1; i < v; i++) {// 1、prim三部曲,第一步:選距離生成樹最近節點int cur = -1; // 選中哪個節點 加入最小生成樹int minVal = Integer.MAX_VALUE;for (int j = 1; j <= v; j++) { // 1 - v,頂點編號,這里下標從1開始//  選取最小生成樹節點的條件://  (1)不在最小生成樹里//  (2)距離最小生成樹最近的節點if (!isInTree[j] && minDist[j] < minVal) {minVal = minDist[j];cur = j;}}// 2、prim三部曲,第二步:最近節點(cur)加入生成樹isInTree[cur] = true;// 3、prim三部曲,第三步:更新非生成樹節點到生成樹的距離(即更新minDist數組)// cur節點加入之后, 最小生成樹加入了新的節點,那么所有節點到 最小生成樹的距離(即minDist數組)需要更新一下// 由于cur節點是新加入到最小生成樹,那么只需要關心與 cur 相連的 非生成樹節點 的距離 是否比 原來 非生成樹節點到生成樹節點的距離更小了呢for (int j = 1; j <= v; j++) {// 更新的條件:// (1)節點是 非生成樹里的節點// (2)與cur相連的某節點的權值 比 該某節點距離最小生成樹的距離小// 很多錄友看到自己 就想不明白什么意思,其實就是 cur 是新加入 最小生成樹的節點,那么 所有非生成樹的節點距離生成樹節點的最近距離 由于 cur的新加入,需要更新一下數據了if (!isInTree[j] && grid[cur][j] < minDist[j]) {minDist[j] = grid[cur][j];}}}// 統計結果int result = 0;for (int i = 2; i <= v; i++) { // 不計第一個頂點,因為統計的是邊的權值,v個節點有 v-1條邊result += minDist[i];}System.out.println(result);}
}
小結

prim算法的關鍵是加點。

prim三步曲

  1. 第一步,選距離生成樹最近節點
  2. 第二步,最近節點加入生成樹
  3. 第三步,更新非生成樹節點到生成樹的距離(即更新minDist數組)
Kruskal 算法實現
import java.util.*;class Edge implements Comparable<Edge> {int l, r, val;Edge(int l, int r, int val) {this.l = l;this.r = r;this.val = val;}@Overridepublic int compareTo(Edge other) {return Integer.compare(this.val, other.val);}
}class Main {private static int[] father;// 并查集初始化public static void init(int n) {father = new int[n];for (int i = 0; i < n; ++i) {father[i] = i;}}// 并查集的查找操作public static int find(int u) {return u == father[u] ? u : (father[u] = find(father[u])); // 路徑壓縮}// 并查集的加入集合public static void join(int u, int v) {u = find(u); // 尋找u的根v = find(v); // 尋找v的根if (u != v) { // 如果發現根不同,則將v的根指向u的根father[v] = u;}}public static void main(String[] args) {Scanner scanner = new Scanner(System.in);int v = scanner.nextInt();int e = scanner.nextInt();List<Edge> edges = new ArrayList<>();for (int i = 0; i < e; i++) {int v1 = scanner.nextInt();int v2 = scanner.nextInt();int val = scanner.nextInt();edges.add(new Edge(v1, v2, val));}// 按邊的權值對邊進行從小到大排序Collections.sort(edges);// 并查集初始化init(v + 1); // 初始化大小為 v + 1 的并查集,因為節點編號是從 1 開始int result_val = 0;// 從頭開始遍歷邊for (Edge edge : edges) {// 并查集,搜出兩個節點的祖先int x = find(edge.l);int y = find(edge.r);// 如果祖先不同,則不在同一個集合if (x != y) {result_val += edge.val; // 這條邊可以作為生成樹的邊join(x, y); // 兩個節點加入到同一個集合}}System.out.println(result_val);scanner.close();}
}
小結
  • Kruskal算法需要自定義一個數據結構Edge,存放邊和權值
  • 為了方便比較,需要實現Comparable接口

kruscal的思路:

  • 邊的權值排序,因為要優先選最小的邊加入到生成樹里
  • 遍歷排序后的邊
    • 如果邊的兩個節點在同一個集合,說明如果連上這條邊圖中會出現環
    • 如果邊的兩個節點不在同一個集合,加入到最小生成樹,并把兩個節點加入同一個集合

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

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

相關文章

LeetCode 3099.哈沙德數:計算一個數十進制下各位之和

【LetMeFly】3099.哈沙德數&#xff1a;計算一個數十進制下各位之和 力扣題目鏈接&#xff1a;https://leetcode.cn/problems/harshad-number/ 如果一個整數能夠被其各個數位上的數字之和整除&#xff0c;則稱之為 哈沙德數&#xff08;Harshad number&#xff09;。給你一個…

Github 2024-06-30開源項目日報 Top10

根據Github Trendings的統計,今日(2024-06-30統計)共有10個項目上榜。根據開發語言中項目的數量,匯總情況如下: 開發語言項目數量C#項目1Python項目1PowerShell項目1JavaScript項目1Jupyter Notebook項目1TypeScript項目1PHP項目1C++項目1Swift項目1Rust項目1shadcn/ui: 開源…

Laravel介紹與學習入門

Laravel 是一款優雅且功能強大的 PHP Web 開發框架&#xff0c;它被廣泛認為是 PHP 領域內構建現代 Web 應用程序的最佳選擇之一。Laravel 提供了一套簡潔、富有表現力的語法&#xff0c;使得開發者能夠高效地編寫清晰、可維護的代碼。以下是 Laravel 的一些關鍵特點和入門概念…

實戰項目——用Java實現圖書管理系統

前言 首先既然是管理系統&#xff0c;那咱們就要實現以下這幾個功能了--> 分析 1.首先是用戶分為兩種&#xff0c;一個是管理員&#xff0c;另一個是普通用戶&#xff0c;既如此&#xff0c;可以定義一個用戶類&#xff08;user&#xff09;&#xff0c;在定義管理員類&am…

DMA學習筆記

參考文章 https://blog.csdn.net/as480133937/article/details/104927922 DMA簡介 DMA&#xff0c;全稱Direct Memory Access&#xff0c;即直接存儲器訪問。DMAC 即 DMA 控制器&#xff0c;提供了一種硬件的數據傳輸方式&#xff0c;無需 CPU 的介入&#xff0c;可以處理外…

7.6、指針和數組

代碼 #include <iostream> using namespace std;int main() {//指針和數組//利用指針訪問數組中的元素int arr[10] { 1,2,3,4,5,6,7,8,9,10 };cout << "第一個元素為&#xff1a;" << arr[0] << endl;int * p arr;//arr就是數組首地址co…

kaggle量化賽金牌方案(第七名解決方案)(下)

— 無特征工程的神經網絡模型&#xff08;得分 5.34X&#xff09; 比賽進入最后階段&#xff0c;現在是時候深入了解一些關于神經網絡模型的見解了。由于 Kaggle 討論區的需求&#xff0c;我在這里分享兩個神經網絡模型。第一個是 LSTM 模型&#xff0c;第二個是卷積網絡&…

華為機試HJ6質數因子

華為機試HJ6質數因子 題目&#xff1a; 按照從小到大輸出給定數值的質數因子 想法&#xff1a; 遍歷判斷從小到大的數值是否是給定數值的質數因子&#xff0c;是就直接輸出&#xff0c;該方法輸出的數值已經排序好了 import mathinput_number int(input())# 循環判斷提取…

鴻翼FEX文件安全交換系統,打造安全高效的文件擺渡“綠色通道”

隨著數字經濟時代的到來&#xff0c;數據已成為最有價值的生產要素&#xff0c;是企業的重要資產之一。隨著數據流動性的增強&#xff0c;數據安全問題也隨之突顯。尤其是政務、金融、醫療和制造業等關鍵領域組織和中大型企業&#xff0c;面臨著如何在保障數據安全的同時&#…

llm學習-3(向量數據庫的使用)

1&#xff1a;數據讀取和加載 接著上面的常規操作 加載環境變量---》獲取所有路徑---》加載文檔---》切分文檔 代碼如下&#xff1a; import os from dotenv import load_dotenv, find_dotenvload_dotenv(find_dotenv()) # 獲取folder_path下所有文件路徑&#xff0c;儲存在…

【力扣 - 每日一題】3099. 哈沙德數 | 模擬 (Go/C++)

題目內容 如果一個整數能夠被其各個數位上的數字之和整除&#xff0c;則稱之為 哈沙德數&#xff08;Harshad number&#xff09;。給你一個整數 x 。如果 x 是 哈沙德數 &#xff0c;則返回 x 各個數位上的數字之和&#xff0c;否則&#xff0c;返回 -1 。 示例 1&#xff1…

C++Primer Plus 第十四章代碼重用:編程練習,第3題

CPrimer Plus 第十四章代碼重用&#xff1a;編程練習,第3題 編程練習,第3題 提示&#xff1a;寫完文章后&#xff0c;目錄可以自動生成&#xff0c;如何生成可參考右邊的幫助文檔 文章目錄 CPrimer Plus 第十四章代碼重用&#xff1a;編程練習,第3題前言定義一個 QueueTp 模板…

中國國產AI芯片的崛起

一、CUDA的壟斷 當討論半導體行業面臨的挑戰時&#xff0c;你首先想到的是什么&#xff1f;光刻機&#xff1f;3納米或者5納米技術&#xff1f;我們無法生產的完美方形芯片&#xff1f;是的&#xff0c;但也不完全是。 人們經常把半導體芯片歸類為硬件產業&#xff0c;但實際上…

【大模型LLM面試合集】大語言模型基礎_llm概念

1.llm概念 1.目前 主流的開源模型體系 有哪些&#xff1f; 目前主流的開源LLM&#xff08;語言模型&#xff09;模型體系包括以下幾個&#xff1a; GPT&#xff08;Generative Pre-trained Transformer&#xff09;系列&#xff1a;由OpenAI發布的一系列基于Transformer架構…

Linux常用查看日志方法-如使用less查看日志文件

在Linux系統中&#xff0c;查看日志文件是常見的運維任務之一。less命令是一個非常強大的工具&#xff0c;用于查看長文本文件&#xff0c;例如日志文件。它允許你按頁瀏覽文件&#xff0c;并提供了一些便捷的導航和搜索功能。 使用less查看日志文件 假設你有一個日志文件/va…

linux環境安裝elasticsearch緩存數據庫和Kibana客戶端

linux環境安裝elasticsearch緩存數據庫&#xff0c;今天我們安裝7.17.18版本&#xff0c;并分析遇到的問題。 一、elasticsearch安裝運行 1、直接下載 wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.17.18-linux-x86_64.tar.gz2、解壓 tar -…

驚艷眼球的視覺盛宴【二】

當晨光初破黎明的靜謐&#xff0c;一片絢爛便悄然鋪展在蔚藍的天際。那一刻&#xff0c;大地蘇醒&#xff0c;萬物復蘇&#xff0c;我們仿佛踏入了一幅活生生的畫卷。霧氣繚繞之中&#xff0c;群山似乎在低語&#xff0c;古樹在輕搖&#xff0c;一切都沐浴在柔和而金黃的光芒之…

如何理解vuex中的每個概念(通俗易懂)

文章目錄 1. 什么是 Vuex&#xff1f;2. Vuex 的四個核心概念 1. 什么是 Vuex&#xff1f; 想象一下&#xff0c;你家里有一個大冰箱&#xff0c;所有家庭成員都可以訪問這個冰箱。每個人都可以往里面放東西&#xff0c;也可以從里面拿東西。這個冰箱就像是 Vuex 中的“狀態”…

戰略流程-麥肯錫企業數字化業務變革成熟度評估模型及案例深度解析

一、企業變革成熟度評估模型 企業變革成熟度診斷模型是一種評估工具&#xff0c;用于全面掃描和評估企業在變革轉型過程中的能力水平。該模型通過一系列量化指標和定性分析&#xff0c;對企業在不同變革領域的成熟度進行評分&#xff0c;從而幫助企業識別在變革過程中的優勢和…

第12天:上下文管理器

今日學習目標 了解上下文管理器的基本概念和作用學習如何使用 with 語句學習如何創建自定義上下文管理器理解上下文管理器的實際應用場景 1. 上下文管理器簡介 上下文管理器是一種用于管理資源的機制&#xff0c;它可以在一段代碼執行前后自動執行一些操作。最常見的上下文管…