圖論筆記1

1.1鄰接矩陣儲存法

//創建:二維數組vector<vector<int>> graph(n,vector<int>(n,0));//儲存for(int i=0;i<m;i++){int x1,x2;cin>>x1>>x2;graph[x1-1][x2-1]=1;}

1.2鄰接表儲存法

補充:c++中的list是鏈表 鏈接

//創建:數組+鏈表
vector<list<int>> graph(n + 1);//輸入
while (m--) {cin >> s >> t;// 使用鄰接表 ,表示 s -> t 是相連的graph[s].push_back(t);
}
//讀取數據
if (result.size() == 0) cout << -1 << endl;for (const vector<int> &pa : result) {for (int i = 0; i < pa.size() - 1; i++) {cout << pa[i] << " ";}cout << pa[pa.size() - 1]  << endl;}

2.1 dfs

所有可達路徑

dfs三部曲:
確認遞歸函數和參數、確認終止條件、處理目前搜索節點的出發路徑(處理節點、dfs遞歸、回溯)

#include<iostream>
#include<vector>
using namespace std;vector<vector<int>> results;
vector<int> result;//1 確認遞歸函數參數: 鄰接表,當前歷遍節點,終點
void dfs(const vector<vector<int>>& graph,int x,int n){//2 確認終止條件:當當前節點x = 最后一個節點n,就是從起點到了終點if(x==n-1){results.push_back(result);//存入結果return;}//3、處理目前搜索節點的出發路徑for(int i=0;i<n;i++){if(graph[x][i]){            //找到下一個節點result.push_back(i+1);  //處理節點dfs(graph,i,n);         //處理下一個節點result.pop_back();      //利用vector的性質回溯}}
}int main(){int n,m;cin>>n>>m;vector<vector<int>> graph(n,vector<int>(n,0));for(int i=0;i<m;i++){int x1,x2;cin>>x1>>x2;graph[x1-1][x2-1]=1;}result.push_back(1); //重要!先把開始節點放進去dfs(graph,0,n);if(results.size()==0)cout<<"-1"<<endl;for(int i=0;i<int(results.size());i++){for(int j=0;j<int(results[i].size()-1);j++){cout<<results[i][j]<<" ";}cout<<results[i][results[i].size()-1]<<endl;}}

要注意0的問題。(開辟n個位置從0-n-1,開辟n+1個位置從0-n)

#include<iostream>
#include<vector>
#include<list>
using namespace std;vector<vector<int>> results;
vector<int> result;//1 確認遞歸函數參數: 鄰接表,當前歷遍節點,終點
void dfs(const vector<list<int>>& graph,int x,int n){//2 確認終止條件:當當前節點x = 最后一個節點n,就是從起點到了終點if(x==n-1){results.push_back(result);//存入結果return;}//3、處理目前搜索節點的出發路徑for(int i:graph[x]){            //找到下一個節點result.push_back(i+1);  //處理節點dfs(graph,i,n);         //處理下一個節點result.pop_back();      //利用vector的性質回溯}
}int main(){int n,m;cin>>n>>m;vector<list<int>> graph(n);for(int i=0;i<m;i++){int x1,x2;cin>>x1>>x2;graph[x1-1].push_back(x2-1);}result.push_back(1); //重要!先把開始節點放進去dfs(graph,0,n);if(results.size()==0)cout<<"-1"<<endl;for(int i=0;i<int(results.size());i++){for(int j=0;j<int(results[i].size()-1);j++){cout<<results[i][j]<<" ";}cout<<results[i][results[i].size()-1]<<endl;}}

島嶼問題99

#include<iostream>
#include<vector>
using namespace std;//1、確定參數
void dfs(const vector<vector<int>>& graph,vector<vector<int>>& visited, int x, int y){int dir[4][2]={0,1,  1,0,  -1,0,  0,-1};//2、終止條件(訪問過了/周邊都是0了,一條路就走完了)if(visited[x][y] || graph[x][y]==0) return;//3、處理當前點visited[x][y]=1;for(int i=0;i<4;i++){//上下左右四個位置,作用是感染同一島嶼的所有塊(顏色填充也是這個原理)int newx=x+dir[i][0];int newy=y+dir[i][1];if(newx<0||newx>=int(graph.size())||newy<0||newy>=int(graph[0].size())) continue;dfs(graph,visited,newx,newy);}}int main(){int n,m;cin>>n>>m;vector<vector<int>> graph(n,vector<int>(m,0));for(int i=0;i<n;i++){for(int j=0;j<m;j++){cin>>graph[i][j];}}// for(int i=0;i<n;i++){//     for(int j=0;j<m;j++){//         cout<<graph[i][j]<<" ";//     }//     cout<<endl;// }vector<vector<int>> visited(n,vector<int>(m,0));int result=0;for(int i=0;i<n;i++){for(int j=0;j<m;j++){if(!visited[i][j] && graph[i][j]==1){dfs(graph,visited,i,j);result++;}}}cout<<result;
}

島嶼最大面積100

#include<iostream>
#include<vector>
using namespace std;//1、確定參數(注意!!這里visited和single想要被改變,要傳入變量本身!要用&)
void dfs(const vector<vector<int>>& graph,vector<vector<int>>& visited,int x,int y,int& single){//2、停止條件if(graph[x][y]==0||visited[x][y]){return;}//3、處理當前節點single++;visited[x][y]=1;int dir[4][2]={0,-1,0,1,-1,0,1,0};for(int i=0;i<4;i++){int newx=x+dir[i][0];int newy=y+dir[i][1];if(newx<0||newx>=int(graph.size())||newy<0||newy>=int(graph[0].size())) continue;dfs(graph,visited,newx,newy,single);}
}int main(){int n,m;cin>>n>>m;vector<vector<int>> graph(n,vector<int>(m,0));for(int i=0;i<n;i++){for(int j=0;j<m;j++){cin>>graph[i][j];}}int result=0;vector<int> s;vector<vector<int>> visited(n,vector<int>(m,0));for(int i=0;i<n;i++){for(int j=0;j<m;j++){if(!visited[i][j] && graph[i][j]==1){int single=0;dfs(graph,visited,i,j,single);result=max(result,single);}}}cout<<result;}

2.2 最小生成樹

prim

#include<iostream>
#include <vector>
#include <climits>
using namespace std;int main(){int v,e;cin>>v>>e;vector<vector<int>> graph(v+1,vector<int>(v+1,100001));while(e--){int x1,x2,val;cin>>x1>>x2>>val;graph[x1][x2]=val;//是無向圖graph[x2][x1]=val;}//------------------檢查用----------------------------// for(int i=1;i<=v;i++){//     for(int j=1;j<=v;j++){//         cout<<graph[i][j]<<" ";//     }//     cout<<endl;// }//----------------------------------------------------vector<int> minDist(v+1,100001);vector<int> intree(v+1,false);vector<int> arc(v+1);int start=-1;for(int count=1;count<v;count++){//循環n-1次//1、選距離生成樹最近的節點,即更新startint min=INT_MAX;for(int i=1;i<=v;i++){if(!intree[i] && minDist[i]<min) {//這里是算生成樹的每個節點與離它最近的樹外節點的距離min=minDist[i];start=i;}}if(start==-1) {cout<<"-1"<<endl;return 0;}//把最近的節點加入生成樹intree[start]=1;//------------------檢查用----------------------------// for(int i=1;i<=v;i++){//     cout<<minDist[i]<<" ";// }// cout<<"###################"<<endl;//----------------------------------------------------//3、更新非生成樹節點到生成樹的距離,即minDist數組。并記錄1中最短邊,即更新arc數組for(int j=1;j<=v;j++){if(!intree[j] && graph[start][j]<minDist[j]){//只要一端在start,另一端不在樹里,且值比當前位置值小的,都放進來minDist[j]=graph[start][j];arc[j]=start;}}//------------------檢查用----------------------------// for(int i=1;i<=v;i++){//     cout<<minDist[i]<<" ";// }// cout<<"-------------------"<<endl;//----------------------------------------------------}int total=0;for(int i=2;i<=v;i++){total+=minDist[i];}cout<<total<<endl;
}

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

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

相關文章

GB28181系列三:GB28181流媒體服務器ZLMediaKit

我的音視頻/流媒體開源項目(github) GB28181系列目錄 目錄 一、ZLMediaKit介紹 二、 ZLMediaKit安裝、運行(Ubuntu) 1、安裝 2、運行 3、配置 三、ZLMediaKit使用 一、ZLMediaKit介紹 ZLMediaKit是一個基于C11的高性能運營級流媒體服務框架&#xff0c;項目地址&#xf…

iPhone恢復技巧:如何從 iPhone 恢復丟失的照片

在計算機時代&#xff0c;我們依靠手機來捕捉和存儲珍貴的回憶。但是&#xff0c;如果您不小心刪除或丟失了手機上的照片怎么辦&#xff1f;這真的很令人沮喪和煩惱&#xff0c;不是嗎&#xff1f;好吧&#xff0c;如果您在 iPhone 上丟失了照片&#xff0c;您不必擔心&#xf…

如何將你的 Ruby 應用程序從 OpenSearch 遷移到 Elasticsearch

作者&#xff1a;來自 Elastic Fernando Briano 將 Ruby 代碼庫從 OpenSearch 客戶端遷移到 Elasticsearch 客戶端的指南。 OpenSearch Ruby 客戶端是從 7.x 版 Elasticsearch Ruby 客戶端分叉而來的&#xff0c;因此代碼庫相對相似。這意味著當將 Ruby 代碼庫從 OpenSearch 遷…

LeetCode 283.移動零(超簡單講解)

283.移動零 題目示例示例1示例2 解題思路快慢指針實現設計 詳細代碼 題目 給定一個數組 nums&#xff0c;編寫一個函數將所有 0 移動到數組的末尾&#xff0c;同時保持非零元素的相對順序。 請注意 &#xff0c;必須在不復制數組的情況下原地對數組進行操作。 示例 示例1 …

Day8 神經網絡中的導數基礎

Day8 神經網絡中的導數基礎 導數的定義 導數&#xff08;Derivative&#xff09;是微積分中的一個核心概念&#xff0c;用于描述函數在某一點的變化率。簡單來說&#xff0c;導數就是函數值隨自變量微小變化而產生的變化量&#xff0c;即斜率或變化率。假設有一個函數 f ( x…

RequestContextHolder 與 HttpServletRequest 的聯系

1. 什么是 RequestContextHolder&#xff1f; RequestContextHolder 是 Spring 框架 提供的一個工具類&#xff0c;用于在當前線程中存儲和獲取與請求相關的上下文信息。它是基于 ThreadLocal 實現的&#xff0c;能夠保證每個線程獨立存儲和訪問請求信息。 與 HttpServletReq…

SpringBoot配置和啟動

1.內部配置加載順序&#xff1a; 加載規則 加載順序和優先級與配置文件所在路徑有關優先級高的配置會覆蓋優先級低的配置&#xff0c;配置文件會全部加載&#xff0c;遇到相同的配置高優先級覆蓋低優先級命令行參數 -spring.config.location 自定義配置文件路徑&#xff0c;可…

【視頻生成模型】——Hunyuan-video 論文及代碼講解和實操

&#x1f52e;混元文生視頻官網 | &#x1f31f;Github代碼倉庫 | &#x1f3ac; Demo 體驗 | &#x1f4dd;技術報告 | &#x1f60d;Hugging Face 文章目錄 論文詳解基礎介紹數據預處理 &#xff08;Data Pre-processing&#xff09;數據過濾 (Data Filtering)數據標注 (Data…

52 基于單片機的超聲波、溫濕度、光照檢測分階段報警

目錄 一、主要功能 二、硬件資源 三、程序編程 四、實現現象 一、主要功能 1.通過DHT11模塊讀取環境溫度和濕度: 2.將濕度、障礙物距顯示在lcd1602上面&#xff0c;第一行顯示溫度和濕度,格式為:xxCyy%&#xff0c;第二行顯示超聲波傳感器測得的距離&#xff0c;格式為:Di…

大數據與AI:從分析到預測的躍遷

引言&#xff1a;數據時代的新紀元 從每天的社交分享到企業的運營決策&#xff0c;數據早已成為現代社會不可或缺的資源。我們正置身于一個數據爆炸的時代&#xff0c;數以億計的信息流實時生成&#xff0c;為人類帶來了前所未有的洞察能力。然而&#xff0c;數據的價值并不僅限…

3D視覺[一]3D計算機視覺

3D視覺[一]3D計算機視覺 3D計算機視覺概述 像機標定 文章目錄 3D視覺[一]3D計算機視覺前言一、人類視覺二、計算機視覺2.1 計算機視覺的研究目的2.2 計算機視覺的研究任務2.3 計算機視覺的研究方法2.4 視覺計算理論2.5 馬爾框架中計算機視覺表達的四個層次2.5.1 圖像&#xff…

OpenCV目標檢測 級聯分類器 C++實現

一.目標檢測技術 目前常用實用性目標檢測與跟蹤的方法有以下兩種&#xff1a; 幀差法 識別原理&#xff1a;基于前后兩幀圖像之間的差異進行對比&#xff0c;獲取圖像畫面中正在運動的物體從而達到目標檢測 缺點&#xff1a;畫面中所有運動中物體都能識別 舉個例子&#xf…

QT從入門到精通(二) ——信號與槽機制

Qt 的信號與槽機制&#xff08;Signal and Slot&#xff09;是 Qt 框架 中用于對象間通信的核心機制之一。它允許對象之間進行松耦合的事件驅動式通信&#xff0c;尤其適合 GUI 應用程序 中的事件處理。 1. 基本概念 信號 (Signal) 當對象的狀態發生變化時&#xff0c;它會發…

如何使用git新建本地倉庫并關聯遠程倉庫的步驟(詳細易懂)

一、新建本地倉庫并關聯遠程倉庫的步驟 新建本地倉庫 打開終端&#xff08;在 Windows 上是命令提示符或 PowerShell&#xff0c;在 Linux 和Mac上是終端應用&#xff09;&#xff0c;進入你想要創建倉庫的目錄。例如&#xff0c;如果你想在桌面上創建一個名為 “my - project”…

1Panel應用推薦:MaxKB開源知識庫問答系統

1Panel&#xff08;github.com/1Panel-dev/1Panel&#xff09;是一款現代化、開源的Linux服務器運維管理面板&#xff0c;它致力于通過開源的方式&#xff0c;幫助用戶簡化建站與運維管理流程。為了方便廣大用戶快捷安裝部署相關軟件應用&#xff0c;1Panel特別開通應用商店&am…

element plus的table組件,點擊table的數據是,會出現一個黑色邊框

在使用 Element Plus 的 Table 組件時&#xff0c;如果你點擊表格數據后出現了一個黑色邊框&#xff0c;這通常是因為瀏覽器默認的焦點樣式&#xff08;outline&#xff09;被觸發了。如圖&#xff1a; 你可以通過自定義 CSS 來隱藏這個黑色邊框&#xff0c;代碼如下&#xff1…

瀧羽sec學習打卡-brupsuite7搭建IP炮臺

聲明 學習視頻來自B站UP主 瀧羽sec,如涉及侵權馬上刪除文章 筆記的只是方便各位師傅學習知識,以下網站只涉及學習內容,其他的都 與本人無關,切莫逾越法律紅線,否則后果自負 關于brupsuite的那些事兒-Brup-IP炮臺搭建 搭建炮臺服務端安裝zmap1、更新系統和安裝基礎依賴&#xff…

赫布定律 | 機器學習 / 反向傳播 / 經驗 / 習慣

注&#xff1a;本文為 “赫布定律” 相關文章合輯。 未整理。 赫布定律 Hebb‘s law 馥墨軒 2021 年 03 月 13 日 00:03 1 赫布集合的基本定義 唐納德?赫布&#xff08;Donald Hebb&#xff09;在 1949 年出版了《行為的組織》&#xff08;The Organization of Behavior&a…

各個數據庫優劣勢對比

1.關系型數據庫&#xff08;RDBMS&#xff09; 優勢&#xff1a; ? 數據一致性&#xff1a;通過嚴格的事務處理和ACID&#xff08;原子性、一致性、隔離性、持久性&#xff09;特性&#xff0c;確保數據的一致性和完整性。 ? 易于理解和使用&#xff1a;關系型數據庫的表結構…

Excel中如何消除“長短款”

函數微調可以可以實施&#xff0c;簡單且易于操作的氣球&#x1f388;漲縮更妙。 (筆記模板由python腳本于2024年12月17日 06:19:13創建&#xff0c;本篇筆記適合用Excel操作數據的coder翻閱) 【學習的細節是歡悅的歷程】 Python 官網&#xff1a;https://www.python.org/ Fre…