圖論的整合

有若干個節點,有若干條邊連接節點。(兩個點之間不是必須相連)
比如:
在這里插入圖片描述

有向圖

可以理解為邊上面有箭頭的圖,比如下面這張圖:
在這里插入圖片描述
在這張圖中,點 111 可以通過這條有向邊到達點 222,但是點 222 到達不了點 111
有向圖的邊是有單向性的。

無向圖

只要連了邊,邊兩端的點都可以互相到達。
在這里插入圖片描述

這張圖是無向圖,里面任一點都可以互相到達。
這就是一張連通圖。

連通圖

一張無向圖,如果任意一個點都可以到達圖上的所有點,那么這張無向圖就是連通圖。
如圖1

強連通圖

一張有向圖,如果任意兩個點都可以互相到達,這就是一張強連通圖。
在這里插入圖片描述比如上面的這張圖就是不聯通的,不是強連通圖。
如果再加上一條邊:
在這里插入圖片描述
現在這就是一張強連通圖了。

帶權圖

可以理解為圖中的邊被加上了一個權值,經過這條邊就要付出對應權值的代價。
比如:
在這里插入圖片描述
在這張圖中,點 111 走到點 444 的總權值是 3+5+2=103+5+2=103+5+2=10

圖的存儲

鄰接矩陣

假設有一個 NNN 個點的圖,我們可以開一個 N?NN*NN?N 的二維數組 aaaaija_{ij}aij? 表示點 iii 到點 jjj 有沒有邊。
如果是帶權圖,也可以用 aija_{ij}aij? 表示點 iii 到點 jjj 邊的權值。

例題1

題目描述
給出一個無向圖,頂點數為 nnn,邊數為 mmmn≤1000,m≤10000n\le1000,m\le10000n1000,m10000
輸入格式
第一行兩個整數 n,mn,mn,m,接下來有 mmm 行,每行兩個整數 u,vu,vu,v,表示點 uuu 到點 vvv 有一條邊。
輸出格式
由小到大依次輸出每個點的鄰接點,鄰接點也按照由小到大的順序輸出。

首先 nnn 只有 100010001000,可以用鄰接矩陣存圖。
是無向圖,所以 uuuvvvvvvuuu 都有一條邊,所以要雙向存。

#include<bits/stdc++.h>
#define psp putchar(' ')
#define endl putchar('\n')
using namespace std;
const int M=1e3+5;
int read(){int x=0,f=1;char c=getchar();while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}while(c>='0'&&c<='9')x=(x<<3)+(x<<1)+c-'0',c=getchar();return x*f;
}
void print(int x){if(x<0)putchar('-'),x=-x;if(x<10){putchar(x+'0');return;}print(x/10);putchar(x%10+'0');
}
int n,m;
int a[M][M];
signed main(){n=read(),m=read();for(int i=1;i<=m;i++){int u=read(),v=read();//雙向存邊a[u][v]=1;a[v][u]=1;}for(int i=1;i<=n;i++){for(int j=1;j<=n;j++){if(a[i][j])print(j),psp;//有邊,輸出。}endl;}
}
鄰接表

假如一張圖有 204820482048 個點,那么用鄰接矩陣就要開 204822048^220482 的數組,那如果這張圖只有 101010 條邊,開這么大的空間就全浪費了。
這時候就要用到鄰接表。
可以用動態數組來存點和邊,減少空間的浪費。

vector<int>a[N];
例題2

題目描述
給出一個無向圖,頂點數為 nnn,邊數為 mmmn≤1000,m≤10000n\le1000,m\le10000n1000,m10000
輸入格式
第一行兩個整數 n,mn,mn,m,接下來有 mmm 行,每行兩個整數 u,vu,vu,v,表示點 uuu 到點 vvv 有一條邊。
輸出格式
第i行輸出第點 iii 的所有鄰接點,鄰接點按照度數由小到大輸出,如果度數相等,則按照編號有小到大輸出。

按照度數排序,用鄰接表更方便。

#include<bits/stdc++.h>
#define endl putchar('\n')
using namespace std;
const int N=1e6+5;
int read(){int x=0,f=1;char c=getchar();while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}while(c>='0'&&c<='9')x=(x<<3)+(x<<1)+c-'0',c=getchar();return x*f;
}
void print(int x){if(x<0)putchar('-'),x=-x;if(x<10){putchar(x+'0');return;}print(x/10);putchar(x%10+'0');
}
int n,m;
vector<int>a[N];
int d[N];
bool cmp(int a,int b){//按照度數排序return d[a]<d[b]||(d[a]==d[b]&&a<b);
}
signed main(){n=read(),m=read();for(int i=1;i<=m;i++){int u=read(),v=read();//鄰接表存圖a[u].push_back(v);a[v].push_back(u);d[u]++,d[v]++;}for(int i=1;i<=n;i++){sort(a[i].begin(),a[i].end(),cmp);for(int j=0;j<a[i].size();j++)print(a[i][j]),psp;endl;}
}
例題3

題目描述
K(1≤K≤100)K(1\le K\le100)K(1K100) 只奶牛分散在 N(1≤N≤1000)N(1\le N\le1000)N(1N1000) 個牧場。現在她們要集中起來進餐。
牧場之間有 M(1≤M≤10000)M(1\le M\le10000)M(1M10000) 條有向路連接,而且不存在起點和終點相同的有向路。她們進餐的地點必須是所有奶牛都可到達的地方。
那么,有多少這樣的牧場呢?
輸入格式
第1行輸入 K,N,MK,N,MK,N,M
接下來 KKK 行,每行一個整數表示一只奶牛所在的牧場編號。
接下來 MMM 行,每行兩個整數,表示一條有向路的起點和終點。
輸出格式
所有奶牛都可到達的牧場個數。

由于 NNN 最大只有 100010001000KKK 最大只有 100100100,所以可以考慮枚舉每一頭牛,然后記他們可以到達的點,最后的答案就有所有牛都能到達點的數量。

#include<bits/stdc++.h>
using namespace std;
const int N=1e6+5;
int read(){int x=0,f=1;char c=getchar();while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}while(c>='0'&&c<='9')x=(x<<3)+(x<<1)+c-'0',c=getchar();return x*f;
}
void print(int x){if(x<0)putchar('-'),x=-x;if(x<10){putchar(x+'0');return;}print(x/10);putchar(x%10+'0');
}
int n,m,k;
int cow[N];
vector<int>a[N];
int vis[N];
int dis[N];//dis[i]表示點i有幾頭牛可以到達
signed main(){k=read(),n=read(),m=read();for(int i=1;i<=k;i++)cow[i]=read();while(m--){int u=read(),v=read();a[u].push_back(v);}for(int i=1;i<=k;i++){queue<int>q;for(int j=1;j<=n;j++)vis[j]=0;vis[cow[i]]=1;q.push(cow[i]);while(!q.empty()){int x=q.front();q.pop();dis[x]++;//記錄for(int p=0;p<a[x].size();p++){int y=a[x][p];if(vis[y])continue;vis[y]=1;q.push(y);}}}int ans=0;for(int i=1;i<=n;i++)ans+=(dis[i]==k);print(ans);
}
例題4

P3144 [USACO16OPEN] Closing the Farm S
依次遍歷每個倉庫關閉,檢查是否能遍歷到除關閉倉庫外的所有倉庫。

#include<bits/stdc++.h>
#define endl putchar('\n')
using namespace std;
const int N=1e6+5;
int read(){int x=0,f=1;char c=getchar();while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}while(c>='0'&&c<='9')x=(x<<3)+(x<<1)+c-'0',c=getchar();return x*f;
}
void putstr(string s){for(char v:s)putchar(v);
}
int n,m;
vector<int>a[N];
int cl[N];
int vis[N];
signed main(){n=read(),m=read();while(m--){int u=read(),v=read();a[u].push_back(v);a[v].push_back(u);}int st=1;for(int i=1;i<=n;i++){while(cl[st])st++;queue<int>q;q.push(st);for(int i=1;i<=n;i++)vis[i]=0;vis[st]=1;while(!q.empty()){int x=q.front();q.pop();for(int i=0;i<a[x].size();i++){int y=a[x][i];if(vis[y])continue;if(cl[y])continue;vis[y]=1;q.push(y);}}bool flag=1;for(int i=1;i<=n;i++){if(cl[i])continue;if(!vis[i])flag=0;}cl[read()]=1;if(flag)putstr("YES");else putstr("NO");endl;}
}

最短路

一張帶權圖,一個點 xxx 到另一個點 yyy 所經過邊的最小權值和稱為點 xxx 到點 yyy 的最短路。

Dijkstra

一種高效的求最短路的算法,缺點是不能求帶負權的最短路。
它的主要用途是求一個點到圖中其他點的最短路。
具體過程
最開始,除了起點外所有點沒有被標記過,起點是最開始被選中的點。
開始模擬:找到被選中的點連接的最小邊權的且沒有被標記過的點 yyy,記錄最短路,然后點 yyy 被標記,并成為下一個被選中的點,直到所有點都被標記。

例題5

P4779 【模板】單源最短路徑(標準版)
具體代碼見單源最短路徑

SPFA

講解+例題見帶負權的最短路問題


  1. 無向圖 ??

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

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

相關文章

電子設計大賽【C語言核心知識點】講解

目錄 前言 1. 基礎語法 2. 流程控制 3. 函數 4. 數組與字符串 5. 指針&#xff08;核心重點&#xff09; 6. 內存管理 7. 結構體與聯合體 8. 文件操作 9. 預處理器 10. 高級特性 內存布局圖解 前言 在進行程序代碼開發之前&#xff0c;需要掌握好C語言各個模塊之間…

Numpy 庫 矩陣數學運算,點積,文件讀取和保存等

目錄 1.數組&#xff08;矩陣&#xff09;的組合 2.數組&#xff08;矩陣&#xff09;的切割 3.數組的數學運算 4.數組的深拷貝和淺拷貝 5.隨機模塊 6.矩陣統計運算 7.矩陣的特有運算點積&#xff0c;求逆 8.文件讀取和保存 1.數組&#xff08;矩陣&#xff09;的組合 水…

STL學習(?函數對象,謂詞,內建函數對象)

目錄 一、函數對象 1.函數對象的概念 2.函數對象的使用 &#xff08;1&#xff09;函數對象在使用的時候&#xff0c;可以像普通函數那樣調用&#xff0c;可以有參數&#xff0c;也可以有返回值。 &#xff08;2&#xff09;函數對象超出普通函數的概念&#xff0c;函數對象…

【爬蟲】05 - 爬蟲攻防

爬蟲05 - 爬蟲攻防 文章目錄爬蟲05 - 爬蟲攻防一&#xff1a;隨機User-Agent爬蟲1&#xff1a;fake-useragent2&#xff1a;高級反反爬策略3&#xff1a;生產環境建議二&#xff1a;代理IP爬蟲1&#xff1a;獲取代理IP2&#xff1a;高階攻防3&#xff1a;企業級的代理實戰三&am…

FPGA自學——存儲器模型

FPGA自學——存儲器模型 文章目錄FPGA自學——存儲器模型一、IP核二、ROM&#xff08;read only memory&#xff09;三、ROM的IP核調用四、RAM&#xff08;random access memory&#xff09;五、RAM的IP核調用總結1.不同波形的使用的存儲器2.塊與分布式的選擇3.FPGA與模塊的容量…

【C++】stack和queue拓展學習

目錄 1.反向迭代器思路及實現 1.1. 源碼及框架分析 1.2. 實現反向迭代器 2.stack和queue練習拓展-計算器實現 2.1. 后綴表達式概念 2.2. 后綴表達式運算規則 2.3. 中綴表達式轉后綴表達式 2.3.1 轉換思路 2.3.2 代碼實現 2.4. 計算器實現 1.反向迭代器思路及實現 1.1…

Web3與區塊鏈如何革新網絡安全——走在前沿

隨著互聯網技術的飛速發展&#xff0c;網絡安全問題日益成為全球關注的焦點。Web3和區塊鏈技術作為新興的技術力量&#xff0c;正在逐步改變網絡安全的格局。本文將探討Web3和區塊鏈技術如何革新網絡安全&#xff0c;走在技術前沿。 1. Web3技術概述 Web3&#xff0c;即第三代互…

網絡初級安全第三次作業

<!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>用戶登錄</title><style>* {margin:…

CSS中用display實現元素的顯示/隱藏切換

** 通過display中的none和block ** 在前端開發中&#xff0c;display: none 和 display: block 是兩種常用的 CSS 顯示模式&#xff0c;核心區別在于&#xff1a;是否在頁面中保留元素的占位空間 1. 核心區別屬性display: nonedisplay: block占位空間元素完全從渲染樹中移除&am…

因果圖方法設計測試用例的價值與使用范圍

一、因果圖方法的核心原理 因果圖方法通過分析軟件規格說明中的輸入條件&#xff08;因&#xff09;和輸出結果&#xff08;果&#xff09;之間的邏輯關系&#xff0c;利用圖形化方式將這些關系清晰展現。它使用特定的符號表示因果關系&#xff08;如恒等、非、或、與&#xff…

智慧農服數字化平臺-數字科技賦能農業,開啟智慧三農新篇章

智慧農服數字化平臺數字科技賦能農業&#xff0c;開啟智慧三農新篇章平臺概覽在鄉村振興和農業現代化的時代背景下&#xff0c;我們推出了創新的農業服務數字化平臺——一個專為農業生產者打造的綜合性SaaS服務平臺。平臺以"科技助農、數據興農"為使命&#xff0c;通…

在線教育培訓課程視頻如何防下載、防盜錄?

在數字化學習日益普及的今天&#xff0c;高質量的在線課程已成為教育機構、知識付費平臺和講師的核心競爭力。如何在不影響學員正常學習體驗的前提下&#xff0c;有效防止課程視頻被惡意盜取&#xff1f;今天介紹在線教育課程防下載、防盜錄的10種視頻加密方法&#xff0c;看看…

圖像分析學習筆記(2):圖像處理基礎

圖像分析學習筆記&#xff1a;圖像處理基礎圖像增強方法圖像復原方法圖像分割方法形態學處理圖像增強方法 目的&#xff1a;改善視覺效果&#xff0c;例如增強對比度定義&#xff1a;為了改善視覺效果、便于人或計算機對圖像的分析理解&#xff0c;針對圖像的特點或存在的問題…

生存分析機器學習問題

研究目標&#xff1a; 開發一個機器學習模型&#xff0c;用于個性化預測XXX的總體生存期。 模型輸入&#xff1a;結合生存時間、治療方案、人口統計學特征和實驗室測試結果等多種特征。 模型輸出&#xff1a;預測二元結果&#xff08;活著 vs. 死亡&#xff09;。 應用場景&…

【華為機試】547. 省份數量

文章目錄547. 省份數量描述示例 1示例 2提示解題思路核心分析問題轉化算法選擇策略1. 深度優先搜索 (DFS)2. 廣度優先搜索 (BFS)3. 并查集 (Union-Find)算法實現詳解方法一&#xff1a;深度優先搜索 (DFS)方法二&#xff1a;廣度優先搜索 (BFS)方法三&#xff1a;并查集 (Union…

09_Spring Boot 整合 Freemarker 模板引擎的坑

09_Spring Boot 整合 Freemarker 模板引擎的坑 1.背景&#xff1a; springboot 版本&#xff1a;3.0.2 2. 引入依賴 在 pom.xml 中添加&#xff1a; <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web<…

十七、【Linux系統yum倉庫管理】替換阿里源、搭建本地yum源

替換阿里源、搭建本地yum源本章學習目標內容簡介阿里外網源核心功能本地yum核心功能操作演示替換阿里外網源備份原有yum源清理沖突配置下載阿里源配置文件添加EPEL擴展源清理緩存重建索引驗證源狀態測試安裝軟件使用鏡像搭建本地倉庫準備ISO鏡像創建掛載點目錄掛載iso文件驗證掛…

家庭網絡怎么進行公網IP獲取,及內網端口映射外網訪問配置,附無公網IP提供互聯網連接方案

在家庭網絡中&#xff0c;我們常常需要通過公網IP來訪問內網中的設備&#xff0c;比如家庭NAS、Web服務器或監控攝像頭。要實現這個目標&#xff0c;首先要確保你的網絡具有一個可用的公網IP&#xff0c;然后通過路由器配置端口映射&#xff08;Port Forwarding&#xff09;。如…

(LeetCode 面試經典 150 題 ) 128. 最長連續序列 (哈希表)

題目&#xff1a;128. 最長連續序列 思路&#xff1a;哈希表&#xff0c;時間復雜度0(n)。 用集合set來實現哈希表的功能&#xff0c;記錄所有出現的元素。然后遍歷元素&#xff0c;細節看注釋。 C版本&#xff1a; class Solution { public:int longestConsecutive(vector&…

Altera Quartus:BAT批處理實現一鍵sof文件轉換為jic文件

sof文件是Quartus編譯默認生成的程序文件&#xff0c;用于通過JTAG口下載到FPGA內部RAM&#xff0c;斷電程序會丟失&#xff0c;jic文件是用于固化到外部Flash中的程序文件&#xff0c;斷電程序不會丟失。本文介紹如何通過批處理文件實現sof到jic的一鍵自動化轉換。 Quartus工程…