NO.95十六屆藍橋杯備戰|圖論基礎-單源最短路|負環|BF判斷負環|SPFA判斷負環|郵遞員送信|采購特價產品|拉近距離|最短路計數(C++)

P3385 【模板】負環 - 洛谷

如果圖中存在負環,那么有可能不存在最短路。
![[Pasted image 20250416144354.png]]

BF算法判斷負環
  • 執?n輪松弛操作,如果第n輪還存在松弛操作,那么就有負環。
#include <bits/stdc++.h>
using namespace std;const int N = 2e3 + 10, M = 3e3 + 10;int n, m;
int pos;
struct node
{int u, v, w;
}e[M * 2];int dist[N];bool bf()
{//初始化memset(dist, 0x3f, sizeof dist);dist[1] = 0;bool flg;for (int i = 1; i <= n; i++){flg = false;for (int j = 1; j <= pos; j++){int u = e[j].u, v = e[j].v, w = e[j].w;if (dist[u] == 0x3f3f3f3f) continue;if (dist[u] + w < dist[v]){flg = true;dist[v] = dist[u] + w;}}if (flg == false) return flg;}return flg;
}int main()
{ios::sync_with_stdio(false);cin.tie(0);int T; cin >> T;while (T--){cin >> n >> m;pos = 0;for (int i = 1; i <= m; i++){int u, v, w; cin >> u >> v >> w;pos++;e[pos].u = u, e[pos].v = v, e[pos].w = w;if (w >= 0){pos++;e[pos].u = v, e[pos].v = u, e[pos].w = w;}}if (bf()) cout << "YES" << endl;else cout << "NO" << endl;}return 0;
}
spfa算法判斷負環
  • 維護?個 cnt 數組記錄從起點到該點所經過的邊數,如果 cnt[i] >= n ,說明有負環
#include <bits/stdc++.h>
using namespace std;typedef pair<int, int> PII;const int N = 2e3 + 10, M = 3e3 + 10;int n, m;
vector<PII> edges[N];int dist[N];
bool st[N]; //標記在隊列中
int cnt[N];bool spfa()
{//初始化memset(dist, 0x3f, sizeof dist);memset(st, 0, sizeof st);memset(cnt, 0, sizeof cnt);queue<int> q;q.push(1);dist[1] = 0;st[1] = true;while (q.size()){auto u = q.front(); q.pop();st[u] = false;for (auto& t : edges[u]){int v = t.first, w = t.second;if (dist[u] + w < dist[v]){dist[v] = dist[u] + w;cnt[v] = cnt[u] + 1;if (cnt[v] >= n) return true;if (!st[v]){q.push(v);st[v] = true;}}}}return false;
}int main()
{ios::sync_with_stdio(false);cin.tie(0);int T; cin >> T;while (T--){cin >> n >> m;for (int i = 1; i <= n; i++) edges[i].clear();for (int i = 1; i <= m; i++){int u, v, w; cin >> u >> v >> w;edges[u].push_back({v, w});if (w >= 0) edges[v].push_back({u, w});}if (spfa()) cout << "YES" << endl;else cout << "NO" << endl;}return 0;
}
常規版-dijkstra堆優化-dijkstrabellman?ford算法spfa算法
算法思想貪?
? 每次拿出還未確定 最短路的點中,距離起點最近的點;
? 打上標記之后,更新出邊所連點的最短路。
使?堆優化找點操作:
? 把還未確定最短路的點扔到堆中,?堆快速找出距離起點最近的點。
暴?松弛:
? 執?n-1輪松弛操作;
? 每次都掃描所有的邊,看看能否松弛。
使?隊列優化bf算
法:
? 只有上?輪被松弛的點,下?輪才有可能松弛。
負邊權失效失效可?可?
負環失效失效可以判斷負環:
? 執?n輪操作,判斷是否松弛
可以判斷負環:
? 創建cnt數組,
標記從起點到該
點的邊數
時間復雜度O(n2)O(mlog m)O(nm)O(km) ~O(nm)

其實還有兩個單源最短路算法,那就是普通bfs以及01bfs:

  • 普通bfs只能處理邊權全部相同且?負的最短路;
  • 01bfs只能解決邊權要么為0,要么為1的情況
P1629 郵遞員送信 - 洛谷

從起點找別的點的最短距離很簡單,直接跑各種最短路算法均可。
但是從別的點回到起點的最短路,如果直接求時間復雜度巨?。思考?件事:

  • 假設從某?點z,到達起點的最短路徑為:z->y->x->s;
  • 那么反過來就是s->x->y->z的最短路徑。
    因此,僅需對原圖的所有圖建??個"反圖",然后跑?遍最短路即可。這就是建"反圖"的技巧
#include <bits/stdc++.h>
using namespace std;const int N = 1e3 + 10;int n, m;
int e[N][N];int dist[N];
bool st[N];void dijkstra()
{memset(dist, 0x3f, sizeof dist);memset(st, 0, sizeof st);dist[1] = 0;for (int i = 1; i <= n; i++){int a = 0;for (int j = 1; j <= n; j++)if (!st[j] && dist[j] < dist[a])a = j;st[a] = true;for (int b = 1; b <= n; b++){int c = e[a][b];if (dist[a] + c < dist[b]){dist[b] = dist[a] + c;}}}
}int main()
{ios::sync_with_stdio(false);cin.tie(0);cin >> n >> m;memset(e, 0x3f, sizeof e);for (int i = 1; i <= m; i++){int a, b, c; cin >> a >> b >> c;e[a][b] = min(e[a][b], c);}dijkstra();int ret = 0;for (int i = 1; i <= n; i++) ret += dist[i];//反圖for (int i = 1; i <= n; i++)for (int j = i+1; j <= n; j++)swap(e[i][j], e[j][i]);dijkstra();for (int i = 1; i <= n; i++) ret += dist[i];cout << ret << endl;return 0;
}
P1744 采購特價商品 - 洛谷

看數據范圍,所有的最短路算法均可解決,這?使?BF算法。
?需建圖,只?把所有的邊存下來。注意是?向邊,所以要存兩次,空間也要開兩倍。
在所有邊上做?次bf算法,輸出結果即可

#include <bits/stdc++.h>
using namespace std;const int N = 110, M = 1010;int n, m, s, t;
double x[N], y[N];struct node
{int a, b;double c;
}e[M];double calc(int i, int j)
{double dx = x[i] - x[j];double dy = y[i] - y[j];return sqrt(dx * dx + dy * dy);
}double dist[N];void bf()
{for (int i = 1; i <= n; i++) dist[i] = 1e10;dist[s] = 0;for (int i = 1; i < n; i++){for (int j = 1; j <= m; j++){int a = e[j].a, b = e[j].b;double c = e[j].c;if (dist[a] + c < dist[b]){dist[b] = dist[a] + c;}if (dist[b] + c < dist[a]){dist[a] = dist[b] + c;}}}
}int main()
{cin >> n;for (int i = 1; i <= n; i++) cin >> x[i] >> y[i];cin >> m;for (int i = 1; i <= m; i++){int a, b; cin >> a >> b;e[i].a = a; e[i].b = b; e[i].c = calc(a, b);}cin >> s >> t;bf();printf("%.2lf\n", dist[t]);return 0;
}
P2136 拉近距離 - 洛谷

bf算法判斷負環即可。但要注意?下細節:

  1. 題?中給的是距離w是能縮?的數,因此存邊的時候,應該存成相反數;
  2. 愛情是雙向奔赴的,我們要在1->n和n->1兩種情況??選擇最?值
#include <bits/stdc++.h>
using namespace std;const int N = 1e3 + 10, M = 1e4 + 10;int n, m;
struct node
{int a, b, c;
}e[M];int dist[N];bool bf(int s)
{memset(dist, 0x3f, sizeof dist);dist[s] = 0;bool flg;for (int i = 1; i <= n; i++){flg = false;for (int j = 1; j <= m; j++){int a = e[j].a, b = e[j].b, c = e[j].c;if (dist[a] + c < dist[b]){flg = true;dist[b] = dist[a] + c;}}if (flg == false) return flg;}return flg;
}int main()
{ios::sync_with_stdio(false);cin.tie(0);cin >> n >> m;for (int i = 1; i <= m; i++){cin >> e[i].a >> e[i].b >> e[i].c;e[i].c = -e[i].c;}int ret;bool st = bf(1);if (st){cout << "Forever love" << endl;return 0;}ret = dist[n];st = bf(n);if (st){cout << "Forever love" << endl;return 0;}cout << min(ret, dist[1]) << endl;return 0;
}
P1144 最短路計數 - 洛谷

解法?:bfs+動態規劃

  • 因為邊權全都相等,所以可以?bfs找出最短路;
  • 在bfs找最短路的過程中,更新最短路的條數。
    動態規劃:
  1. 狀態表?:設 f[i] 表?從起點?到 i 點的最短路的條數。
  2. 狀態轉移?程: f[i] += f[prev]
    其中 prev 表? i 點的所有前驅,但是要注意是通過最短路過來的前驅。
  3. 填表順序:按照bfs的順序填表。
    解法?:dijkstra算法+動態規劃
    這種解法更通?,因為即使邊權不相等,也可以?dj算法
#include <bits/stdc++.h>
using namespace std;typedef pair<int, int> PII;
const int N = 1e6 + 10, M = 2e6 + 10, MOD = 100003;int n, m;
vector<int> edges[N];int dist[N];
bool st[N];
int f[N];void bfs()
{memset(dist, 0x3f, sizeof dist);queue<int> q;q.push(1);dist[1] = 0;f[1] = 1;while (q.size()){auto a = q.front(); q.pop();for (auto b : edges[a]){if (dist[a] + 1 < dist[b]){dist[b] = dist[a] + 1;f[b] = f[a];q.push(b);}else if (dist[a] + 1 == dist[b]){f[b] = (f[b] + f[a]) % MOD;}}}
}int main()
{ios::sync_with_stdio(false);cin.tie(0);cin >> n >> m;for (int i = 1; i <= m; i++){int a, b; cin >> a >> b;edges[a].push_back(b);edges[b].push_back(a);}bfs();for (int i = 1; i <= n; i++) cout << f[i] << endl;return 0;
}
#include <bits/stdc++.h>
using namespace std;typedef pair<int, int> PII;
const int N = 1e6 + 10, M = 2e6 + 10, MOD = 100003;int n, m;
vector<int> edges[N];int dist[N];
bool st[N];
int f[N];void dijkstra()
{memset(dist, 0x3f, sizeof dist);priority_queue<PII, vector<PII>, greater<PII>> heap;heap.push({0, 1});dist[1] = 0;f[1] = 1;while (heap.size()){auto t = heap.top(); heap.pop();int a = t.second;if (st[a]) continue;st[a] = true;for (auto b : edges[a]){if (dist[a] + 1 < dist[b]){dist[b] = dist[a] + 1;f[b] = f[a];heap.push({dist[b], b});}else if (dist[a] + 1 == dist[b]){f[b] = (f[a] + f[b]) % MOD;}}}
}int main()
{ios::sync_with_stdio(false);cin.tie(0);cin >> n >> m;for (int i = 1; i <= m; i++){int a, b; cin >> a >> b;edges[a].push_back(b);edges[b].push_back(a);}dijkstra();for (int i = 1; i <= n; i++) cout << f[i] << endl;return 0;
}

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

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

相關文章

K8s pod 應用

/** 個人學習筆記&#xff0c;如有問題歡迎交流&#xff0c;文章編排和格式等問題見諒&#xff01; */ &#xff08;1&#xff09;編寫 pod.yaml 文件 pod 是 kubernetes 中最小的編排單位&#xff0c;一個 pod 里包含一個或多個容器。 apiVersion: v1 # 指定api版本 kind…

Oracle創建觸發器實例

一 創建DML 觸發器 DML觸發器基本要點&#xff1a; 觸發時機&#xff1a;指定觸發器的觸發時間。如果指定為BEFORE&#xff0c;則表示在執行DML操作之前觸發&#xff0c;以便防止某些錯誤操作發生或實現某些業務規則&#xff1b;如果指定為AFTER&#xff0c;則表示在執行DML操作…

Filename too long 錯誤

Filename too long 錯誤表明文件名超出了文件系統或版本控制系統允許的最大長度。 可能的原因 文件系統限制 不同的文件系統對文件名長度有不同的限制。例如&#xff0c;FAT32 文件名最長為 255 個字符&#xff0c;而 NTFS 雖然支持較長的文件名&#xff0c;但在某些情況下也…

網絡不可達network unreachable問題解決過程

問題&#xff1a;訪問一個環境中的路由器172.16.1.1&#xff0c;發現ssh無法訪問&#xff0c;ping發現回網絡不可達 C:\Windows\System32>ping 172.16.1.1 正在 Ping 172.16.1.1 具有 32 字節的數據: 來自 172.16.81.1 的回復: 無法訪問目標網。 來自 172.16.81.1 的回復:…

Python設計模式:備忘錄模式

1. 什么是備忘錄模式&#xff1f; 備忘錄模式是一種行為設計模式&#xff0c;它允許在不暴露對象內部狀態的情況下&#xff0c;保存和恢復對象的狀態。備忘錄模式的核心思想是將對象的狀態保存到一個備忘錄對象中&#xff0c;以便在需要時可以恢復到之前的狀態。這種模式通常用…

Python基礎語法3

目錄 1、函數 1.1、語法格式 1.2、函數返回值 1.3、變量作用域 1.4、執行過程 1.5、鏈式調用 1.6、嵌套調用 1.7、函數遞歸 1.8、參數默認值 1.9、關鍵字參數 2、列表 2.1、創建列表 2.2、下標訪問 2.3、切片操作 2.4、遍歷列表元素 2.5、新增元素 2.6、查找元…

JavaEE學習筆記(第二課)

1、好用的AI代碼工具cursor 2、Java框架&#xff1a;Spring(高級框架)、Servelt、Struts、EJB 3、Spring有兩層含義&#xff1a; ①Spring Framework&#xff08;原始框架&#xff09; ②Spring家族 4、Spring Boot(為了使Spring簡化) 5、創建Spring Boot 項目 ① ② ③…

基于Flask與Ngrok實現Pycharm本地項目公網訪問:從零部署

目錄 概要 1. 環境與前置條件 2. 安裝與配置 Flask 2.1 創建虛擬環境 2.2 安裝 Flask 3. 安裝與配置 Ngrok 3.1 下載 Ngrok 3.2 注冊并獲取 Authtoken 4. 在 PyCharm 中創建 Flask 項目 5. 運行本地 Flask 服務 6. 啟動 Ngrok 隧道并獲取公網地址 7. 完整示例代碼匯…

Ragflow、Dify、FastGPT、COZE核心差異對比與Ragflow的深度文檔理解能力??和??全流程優化設計

一、Ragflow、Dify、FastGPT、COZE核心差異對比 以下從核心功能、目標用戶、技術特性等維度對比四款工具的核心差異&#xff1a; 核心功能定位 ? Ragflow&#xff1a;專注于深度文檔理解的RAG引擎&#xff0c;擅長處理復雜格式&#xff08;PDF、掃描件、表格等&#xff09;的…

LeetCode[232]用棧實現隊列

思路&#xff1a; 一道很簡單的題&#xff0c;就是棧是先進后出&#xff0c;隊列是先進先出&#xff0c;用兩個棧底相互對著&#xff0c;這樣一個隊列就產生了&#xff0c;右棧為空的情況&#xff0c;左棧棧底就是隊首元素&#xff0c;所以我們需要將左棧全部壓入右棧&#xff…

postman 刪除注銷賬號

一、刪除賬號 1.右上角找到 頭像&#xff0c;view profile https://123456-6586950.postman.co/settings/me/account 二、找回賬號 1.查看日志所在位置 三、postman更新后只剩下history 在 Postman 中&#xff0c;如果你發現更新后只剩下 History&#xff08;歷史記錄&…

微服務相比傳統服務的優勢

這是一道面試題&#xff0c;咱們先來分析這道題考察的是什么。 如果分析面試官主要考察以下幾個方面&#xff1a; 技術理解深度 你是否清楚微服務架構&#xff08;Microservices&#xff09;和傳統單體架構&#xff08;Monolithic&#xff09;的本質區別。能否從設計理念、技術…

【KWDB 創作者計劃】_深度學習篇---向量指令集

文章目錄 前言一、加速原理數據級并行(DLP)計算密度提升減少指令開銷內存帶寬優化隱藏內存延遲二、關鍵實現技術1. 手動向量化(Intrinsics)優勢挑戰2. 編譯器自動向量化限制3. BLAS/LAPACK庫優化4. 框架級優化三、典型應用場景矩陣運算卷積優化歸一化/激活函數嵌入層(Embe…

跳躍游戲(每日一題-中等)

題解&#xff1a;定義一個變量&#xff0c;用來存儲可以到達的最遠位置。初始化為0。 然后對數組進行遍歷&#xff0c;遍歷開始的時候&#xff0c;先判斷當前這個位置和最遠位置誰大&#xff0c;如果最遠位置比較大&#xff0c;那么就說明當前這個位置也能達到&#xff0c;就看…

第七篇:linux之基本權限、進程管理、系統服務

第七篇&#xff1a;linux之基本權限、進程管理、系統服務 文章目錄 第七篇&#xff1a;linux之基本權限、進程管理、系統服務一、基本權限1、什么是權限&#xff1f;2、為什么要有權限&#xff1f;3、權限與用戶之間的關系&#xff1f;4、權限對應的數字含義5、使用chmod設定權…

音視頻小白系統入門課-2

本系列筆記為博主學習李超老師課程的課堂筆記&#xff0c;僅供參閱 往期課程筆記傳送門&#xff1a; 音視頻小白系統入門筆記-0音視頻小白系統入門筆記-1 課程實踐代碼倉庫&#xff1a;傳送門 音視頻編解碼 可以通過ffmpeg -f avfoundation -list_devices true -i "&…

外賣“三國殺”開新局,餓了么已手握AI牌

【潮汐商業評論/原創】 01 新戰役&#xff0c;新變量 外賣行業&#xff0c;又迎來了新一輪戰役。 前有京東宣布斥資百億進軍外賣市場&#xff0c;后有美團宣布發布即時零售品牌“美團閃購”。雙方在隔空秀肌肉、彰顯自身實力的同時&#xff0c;行業巨頭圍繞本地生活服務的攻…

HAProxy 和 Keepalived 區別

HAProxy 和 Keepalived 是在構建高可用和可擴展Web服務時常用的兩個開源軟件&#xff0c;但它們的核心功能和目的有顯著區別。 簡單來說&#xff1a; HAProxy: 主要是一個 負載均衡器 (Load Balancer) 和 反向代理 (Reverse Proxy)。它負責將客戶端的請求智能地分發到后端的多…

YOLO算法的革命性升級:深度解析Repulsion損失函數在目標檢測中的創新應用

## 一、目標檢測的痛點與YOLO的局限性 在自動駕駛、智能監控等復雜場景中,目標檢測算法常面臨致命挑戰——遮擋問題。當多個物體相互遮擋時,傳統檢測器容易出現漏檢、誤檢現象,YOLO系列算法盡管在速度與精度上表現優異,但在處理密集遮擋目標時仍存在明顯短板。 ### 1.1 遮…

第一篇:Django簡介

第一篇&#xff1a;Django簡介 文章目錄 第一篇&#xff1a;Django簡介一、純手寫一個簡易版的web框架1、軟件開發架構2、HTTP協議3、簡易的socket服務端4、wsgiref模塊5、動靜態網頁6、后端獲取當前時間展示到html頁面上7、字典數據傳給html文件8、數據從數據庫中獲取的展示到…