tarjan縮點+強聯通分量

【模板】縮點https://www.luogu.com.cn/problem/P3387

首先我們要理解這道題為什么要用縮點

題目說的是有向圖,如果無環的話就可以用DP來解決了

由于可以走重復的點,所以一個環上的點可以看成是一個點,它的點權就等于該環上所有點的點權之和,非常符合縮點的作用,所以就可以縮成一個有向無環圖,再用DP解決

強聯通分量

縮點實際上就是找環加DP,找環可以用強聯通分量來解決

具體過程是這樣的:

在遇到環之前一切正常

但當我們回溯到一個點的時候,如果它的low值等于它的dfn值,說明它已經無法與除它的子節點之外的點形成環了,所以我們就遍歷一下之前走過的點,直到遍歷到該節點,此時遍歷到的點就是一個環

強聯通分量代碼:

#include<bits/stdc++.h>
using namespace std;
int n,m,dfn[110000],low[110000],stk[110000],belong[110000],top,tot,cnt;
vector<int>a[110000],ans[110000];
bool vik[110000],instk[110000];
void tarjan(int x)
{dfn[x]=low[x]=++tot;stk[++top]=x;instk[x]=1;for(int i=0;i<a[x].size();i++){if(!dfn[a[x][i]]){tarjan(a[x][i]);low[x]=min(low[x],low[a[x][i]]);//正常tarjan}else if(instk[a[x][i]]) low[x]=min(low[x],dfn[a[x][i]]);}if(low[x]==dfn[x])//找環{int now;cnt++;do{now=stk[top--];ans[cnt].push_back(now);instk[now]=0;belong[now]=cnt;}while(now!=x);}
}
int main()
{scanf("%d%d",&n,&m);for(int i=1;i<=m;i++){int x,y;scanf("%d%d",&x,&y);if(x==y) continue;a[x].push_back(y);}for(int i=1;i<=n;i++) if(!dfn[i]) tarjan(i);for(int i=1;i<=cnt;i++) sort(ans[i].begin(),ans[i].end());printf("%d\n",cnt);for(int i=1;i<=n;i++){if(vik[i]) continue;int x=belong[i];for(int j=0;j<ans[x].size();vik[ans[x][j++]]=1) printf("%d ",ans[x][j]);printf("\n");}return 0;
}

縮點:

找到環之后,我們就可以將其縮成一個點,然后用拓撲跑DP就可以了,十分簡單

建邊:

for(int i=1;i<=n;i++){for(int j=0;j<a[i].size();j++) {if(belong[i]!=belong[a[i][j]])//如果是不在一個環上{e[belong[i]].push_back(belong[a[i][j]]);//連一條邊}}b[belong[i]]+=c[i];}

完整版:?

#include<bits/stdc++.h>
using namespace std;
int n,m,b[210000],c[210000],dfn[210000],low[210000];
int stk[210000],belong[210000],rd[210000],dp[210000],top,cnt,tot;
vector<int>a[210000],e[210000];
bool instk[210000];
void tarjan(int x)
{low[x]=dfn[x]=++tot;stk[++top]=x;instk[x]=1;for(int i=0;i<a[x].size();i++){if(!dfn[a[x][i]]){tarjan(a[x][i]);low[x]=min(low[x],low[a[x][i]]);}else if(instk[a[x][i]]) low[x]=min(low[x],dfn[a[x][i]]);}if(low[x]==dfn[x]){cnt++;int now;do{now=stk[top--];belong[now]=cnt;instk[now]=0;}while(now!=x);}
}
void topo()
{queue<int>q;while(!q.empty()) q.pop();for(int i=1;i<=cnt;i++) if(!rd[i]) q.push(i);for(int i=1;i<=cnt;i++) dp[i]=b[i];while(!q.empty()){int x=q.front();q.pop();for(int i=0;i<e[x].size();i++){dp[e[x][i]]=max(dp[e[x][i]],dp[x]+b[e[x][i]]);if(--rd[e[x][i]]==0) q.push(e[x][i]);}}
}
int main()
{scanf("%d%d",&n,&m);for(int i=1;i<=n;i++) scanf("%d",&c[i]);for(int i=1;i<=m;i++){int x,y;scanf("%d%d",&x,&y);if(x==y) continue;a[x].push_back(y);}for(int i=1;i<=n;i++) if(!dfn[i]) tarjan(i);for(int i=1;i<=n;i++){for(int j=0;j<a[i].size();j++) {if(belong[i]!=belong[a[i][j]]){e[belong[i]].push_back(belong[a[i][j]]);rd[belong[a[i][j]]]++;}}b[belong[i]]+=c[i];}topo();int ans=0;for(int i=1;i<=cnt;i++) ans=max(ans,dp[i]);printf("%d",ans);return 0;
}

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

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

相關文章

OSCP:獲取全交互式 Windows 反向 Shell

簡介 在本文中&#xff0c;我們將探討獲取完全交互式 Windows 反向 Shell 的各種方法&#xff0c;從利用內置工具到采用先進技術以獲得更好的控制和功能。 通過 Invoke-ConPtyShell 我獲取完全交互式 Windows 反向 Shell 的首選方法是通過 Invoke-ConPtyShell 腳本。當 Wind…

免費超好用的電腦操控局域網內的手機(多臺,無線)

使用 第一步 解壓QtScrcpy壓縮包&#xff0c;并運行QtScrcpy.exe 第二步 2.1 手機開啟開發者模式&#xff08;設置>關于本機>版本信息>連點10下“版本號”&#xff09; 2.2 開啟 USB調試 和 無線調試&#xff08;設置>開發者選項> USB調試 無線調試&#xf…

Go語言內存管理

本章節&#xff0c;就來學習一下go語言的內存模型&#xff0c;看一下內存的分配&#xff0c;存儲都是如何實現的&#xff0c;與此同時&#xff0c;在正式開始今天的主題之前&#xff0c;首先先來學習操作系統基于這一方面的內容&#xff0c;來看看是如何管理內存的吧 本章及節…

【docker】啟動臨時MongoDB容器、掛載數據卷運行數據庫服務,并通過備份文件恢復MongoDB數據庫備份數據

?啟動臨時 MongoDB 容器、掛載數據卷運行數據庫服務&#xff0c;并通過備份文件恢復數據 1.命令分解與功能說明1.1.啟動一個臨時 MongoDB 容器?&#xff0c;并進入交互式終端&#xff08;1&#xff09;執行命令&#xff08;2&#xff09;實現功能?&#xff08;3&#xff09;…

【最新 MCP 戰神手冊 08】工具使用詳解:實現 AI 行動

文章目錄 1. 開始啦!2. 第一部分:設計高效且安全的工具3. 第二部分:定義工具藍圖——參數、輸出與約束條件4. 第三部分:彌合差距:LLM 兼容性(函數調用)5. 第四部分:實施與測試的最佳實踐1. 開始啦! 在前幾章中,我們將工具介紹為 AI 模型在 MCP 客戶端引導下向 MCP 服…

介紹 IntelliJ IDEA 快捷鍵操作

IntelliJ IDEA 快捷鍵操作 1. 編輯與導航2. 查找與替換3. 調試與運行4. 導航與視圖5. 重構與生成6. 高級快捷鍵&#xff08;提高效率&#xff09;注意事項 IntelliJ IDEA 是一款功能強大的集成開發環境&#xff0c;掌握其常用快捷鍵可以顯著提升開發效率。但是有些小伙伴并不清…

Javascript 中作用域的理解?

一、作用域的類型 1. 全局作用域&#xff08;公司大門外&#xff09; 范圍&#xff1a;整個 JavaScript 文件變量&#xff1a;像貼在公告欄上的信息&#xff0c;所有人可見例子&#xff1a;const companyName "阿里"; // 全局變量&#xff0c;任何地方都能訪問 fu…

Leetcode刷題記錄22——滑動窗口最大值

題源&#xff1a;https://leetcode.cn/problems/sliding-window-maximum/description/?envTypestudy-plan-v2&envIdtop-100-liked 題目描述&#xff1a; 思路一&#xff1a; 暴力遍歷法&#xff0c;通過一個長度為k的滑動窗口遍歷nums&#xff0c;將其中最大的數依次記…

Apache Flink的架構設計與運行流程說明

在大數據領域&#xff0c;實時計算的重要性隨著業務需求的爆發式增長愈發凸顯。從電商的實時銷量監控到金融的高頻交易風控&#xff0c;從物聯網設備的實時告警到社交平臺的熱點追蹤&#xff0c;企業對“秒級甚至毫秒級”數據處理能力的需求已成為剛需。在眾多實時計算框架中&a…

經典算法 最長單調遞增子序列

最長單調遞增子序列 問題描述 找出由n個數組成的序列的最長單調遞增子序列。 示例輸入 9 2 1 5 3 6 4 8 9 7示例輸出 5示例輸入 6 5 6 7 1 2 8示例輸出 4c代碼(動態規劃 O(n^2)) #include<bits/stdc.h>using namespace std;int main() {int n, ans 0;cin >&g…

【語法】C++繼承中遇到的問題及解決方法

目錄 1.子類構造函數中初始化父類成員 2.子類顯式調用父類的析構函數 第一種說法&#xff1a;重定義 反駁&#xff1a; 第二種說法&#xff1a;operator~ 3.因編譯器版本過低而出現錯誤 貼主在學習C的繼承時&#xff0c;遇到了很多問題&#xff0c;覺得很變態&#xff0c…

前綴和 后綴和 --- 尋找數組的中心下標

題目鏈接 尋找數組的中心下標 給你一個整數數組 nums &#xff0c;請計算數組的 中心下標 。 數組 中心下標 是數組的一個下標&#xff0c;其左側所有元素相加的和等于右側所有元素相加的和。 如果中心下標位于數組最左端&#xff0c;那么左側數之和視為 0 &#xff0c;因為…

NVIDIA --- 端到端自動駕駛

前言 參加了NVIDIA 高級輔助駕駛開發者實驗室的活動&#xff0c;本次活動基于 NVIDIA 汽車行業的端到端解決方案——DRIVE AGX? 平臺&#xff0c;實現高級別智能和安全性的軟硬件開發工具和 AV 基礎設施。并且NVIDIA自動駕駛實驗室推出了一系列自動駕駛算法最新的前沿研究視頻…

SQL實戰:03之SQL中的遞歸查詢

文章目錄 概述SQL 中的遞歸實現題目一:分析組織層級題解題目二:樹節點求解題解步驟一&#xff1a;通過遞歸查詢出每個節點的上級節點和下級節點分布步驟二&#xff1a;分組統計 概述 最近刷題時遇到了一道需要根據組織層級來統計各個層級的一些數據&#xff0c;當時碰到時的第…

MySQL 語法與基礎完全指南

MySQL 是最流行的開源關系型數據庫管理系統之一&#xff0c;廣泛應用于 Web 應用程序開發。本文將全面介紹 MySQL 的基礎知識和完整語法結構。 一、MySQL 基礎概念 1. 數據庫基本術語 數據庫(Database): 存儲數據的集合 表(Table): 數據以表格形式組織 列(Column): 表中的一…

【Sqlalchemy Model轉換成Pydantic Model示例】

【Sqlalchemy Model轉換成Pydantic Model示例】 由于Sqlalchemy和Pydantic的模型字段類型可能有差異, 所以需要一個通用的裝換類 def sqlalchemy_to_pydantic_v2(sqlalchemy_model, pydantic_model):"""通用函數&#xff0c;將 SQLAlchemy 模型實例轉換為 Pyd…

2025年歐洲西南部大停電

2025年4月28日&#xff0c;歐洲西南部出現大規模停電&#xff0c;西班牙、葡萄牙和法國南部均受到影響。有報道指出停電可能與 歐洲電網出現問題有關&#xff0c;但最終原因尚未確定。由于停電&#xff0c;上述地區的交通和通信服務均受到嚴重影響&#xff0c;交通信號燈停止工…

Java EE初階——計算機是如何工作的

1. cpu 馮諾依曼體系&#xff08;Von Neumann Architecture&#xff09; ? CPU 中央處理器: 進?算術運算和邏輯判斷. ? 存儲器: 分為外存和內存, ?于存儲數據(使??進制?式存儲) ? 輸?設備: ??給計算機發號施令的設備. ? 輸出設備: 計算機個??匯報結果的設…

飛鳥游戲模擬器 1.0.3 | 完全免費無廣告,內置大量經典童年游戲,重溫美好回憶

飛鳥游戲模擬器是一款專為安卓用戶設計的免費游戲模擬器&#xff0c;內置了大量經典的童年游戲。該模擬器擁有豐富的游戲資源&#xff0c;目前已有約20,000款游戲&#xff0c;包括多種類型如冒險、動作、角色扮演等。用戶可以直接搜索查找想要玩的游戲進行下載并啟動。游戲庫中…

網絡爬取需謹慎:警惕迷宮陷阱

一、技術背景:網絡爬蟲與數據保護的博弈升級 1. 問題根源:AI訓練數據爬取的無序性 數據需求爆炸:GPT-4、Gemini等大模型依賴數萬億網頁數據訓練,但大量爬蟲無視網站的robots.txt協議(非法律強制),未經許可抓取內容(如新聞、學術論文、代碼),引發版權爭議(如OpenAI被…