洛谷 2921 記憶化搜索 tarjan 基環外向樹

洛谷 2921 記憶化搜索 tarjan


傳送門 (https://www.luogu.org/problem/show?pid=2921)


做這題的經歷有點玄學,,起因是某個random題的同學突然發現了一個0提交0通過的題目,然后就引發了整個機房的興趣,,然后,,就變成了16提交7通過,,

初看上去這題目就是記憶化搜索,但是環的存在使得普通的記憶化會導致漏解,繼續觀察發現整張圖為n個點n條邊,即是多個基環外向樹,使用tarjan找到圖中的環,顯然可知,對于環上一點,能取到的最大值是環的長度,對于環外一點,能取到的最大值是它走到環的長度加上環長,之后采用記憶化搜索或dp即可得解

Warning:

  1. 從樣例可以顯然發現,存在自環
  2. 開始寫tarjan時錯誤的理解了low數組的含義,將其與from數組混淆

int

#include <cstdio>
#include <cstring>
#include <algorithm>const int maxn = 100000 + 100;
int next[maxn];
int dfn[maxn], low[maxn], size[maxn], sta[maxn];
int from[maxn];
int vis[maxn];
int stackTop = 0;
int tim = 0;
int n;
int ans[maxn];void tarjan(int x) {tim++;stackTop++;sta[stackTop] = x;dfn[x] = low[x] = tim;vis[x] = 1;if (!dfn[next[x]]) {tarjan(next[x]);low[x] = std :: min(low[next[x]], low[x]);} else if (vis[next[x]]) {low[x] = std :: min(low[x], dfn[next[x]]);}if (low[x] == dfn[x]) {while (sta[stackTop] != x) {size[x]++;from[sta[stackTop]] = x;vis[sta[stackTop]] = 0;stackTop--;}vis[x] = 0;stackTop--;size[x]++;from[x] = x;}
}void dfs(int x) {if (ans[x] > 0) return;if (from[x] != x || size[x] > 1) {ans[x] = size[from[x]];return;} else if (next[x] == x) {ans[x] = 1;return;} else {dfs(next[x]);ans[x] = 1 + ans[next[x]];}
}int main () {scanf("%d", &n);for (int i = 1; i <= n; i++) {scanf("%d", &next[i]);}for (int i = 1; i <= n; i++) {if (!dfn[i]) tarjan(i);}//for (int i = 1; i <= n; i++) //     printf("%d\n", from[i]);for (int i = 1; i <= n; i++)if (ans[i] == 0) dfs(i);for (int i = 1; i <= n; i++) printf("%d\n", ans[i]);return 0;
}

轉載于:https://www.cnblogs.com/CtsNevermore/p/6018135.html

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

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

相關文章

單片機位尋址舉例_單片機學習:51單片機尋址方式詳解

51單片機是對所有兼容Intel 8031指令系統的單片機的統稱。該系列單片機的始祖是Intel 8031單片機&#xff0c;后來隨著Flash rom 技術的發展&#xff0c;8031單片機取得了長足的發展&#xff0c;成為了應用最廣泛的8位單片機之一。51單片機是基礎入門的一個單片機&#xff0c;并…

網絡知識:LAN、WAN、WLAN相關知識介紹

今天給大家介紹一下LAN、WAN、WLAN相關知識&#xff0c;希望對大家能有所幫助&#xff01; 一、什么是lan、wan和wlan口的區別&#xff1f; 很多朋友對lan口與wan及wlan的用途了解不清楚&#xff0c;尤其是在做路由器橋接時&#xff0c;wan口與lan的連接與設置容易弄混。 1、LA…

jps

jps位于jdk的bin目錄下&#xff0c;其作用是顯示當前系統的java進程情況&#xff0c;及其id號。 jps相當于Solaris進程工具ps。不象”pgrep java”或”ps -ef grep java”&#xff0c;jps并不使用應用程序名來查找JVM實例。因此&#xff0c;它查找所有的Java應用程序&#xff0…

SQL

修改表的列名&#xff1a; exec sp_rename testtable.id,ID,column 根據傳入時間刪除同一天的記錄 1、 delete InventoryMovementsTemp where DateDiff(DD,TrnDate ,1/11/2013)0 2、 where convert(varchar(10),TrnDate,126)’’213-01-10 2、 where trndate>’2013-01-10’…

后端技術:mybatis中resultMap用法示例筆記

1、概念resultMap屬于mybatis返回操作結果的一個標簽&#xff0c;可以用來映射select查詢出來結果的集合&#xff0c;主要作用是將實體類中的字段與數據庫表中的字段進行關聯映射。并且支持復雜的返回結果類型。2、使用場景2.1 屬性映射當數據庫字段和項目中的實體屬性不一致時…

將mysql服務移除_怎么將mysql服務移除?

將mysql服務移除的方法&#xff1a;1、進入“控制面板->程序->卸載或更改程序”&#xff0c;刪除mysql程序&#xff1b;2、刪除MySQL文件夾下的【my.ini】文件&#xff0c;如果備份好&#xff0c;可以直接將文件夾全部刪除 &#xff1b;3、進入注冊表&#xff0c;將相關M…

程序人生:程序員的9個層次,你屬于哪個層次

目錄 第一級&#xff1a;糟糕的程序員 第二級&#xff1a;菜鳥級程序員 第三級&#xff1a;碼農 第四級&#xff1a;普通程序員 第五級&#xff1a;中級程序員 第六級&#xff1a;骨干程序員 第八級&#xff1a;著名程序員 第九級&#xff1a;祖師爺級別 . 第一級&#xff1a;糟…

lsof -i:port 的作用

lsof&#xff08;list open files&#xff09;是一個列出當前系統打開文件的工具。在linux環境下&#xff0c;任何事物都以文件的形式存在&#xff0c;通過文件不僅僅可以訪問常規數據&#xff0c;還可以訪問網絡連接和硬件。如TC和UDP等&#xff0c;系統在后臺都為該應用程序分…

SpringBoot定時任務實現的兩種方式介紹

今天給大家介紹SpringBoot定時任務實現的幾種方式&#xff0c;希望對大家能有所幫助&#xff01;1、SpringTask 用法框架介紹&#xff1a;SpringTask是Spring自帶的輕量級定時任務工具&#xff0c;相比于Quartz使用更加簡單方便&#xff0c;并且不需要不需要引入其他依賴即可使…

mvc調用mysql存儲過程_使用.NET MVC +EF調用oracle的存儲過程

題記&#xff1a;需求如題&#xff0c;在網上搜索了一下&#xff0c;沒有特別貼合我需求的資料&#xff0c;只好自己摸索&#xff0c;東拼西湊了解了一點東西慢慢嘗試做了出來。難點&#xff1a;.NET是微軟產品&#xff0c;主要支持Sql Server數據庫&#xff0c;對于Oracle的數…

Oracle12c:安裝后新建用戶及其默認表空間,并創建表測試

環境&#xff1a;操作系統&#xff1a;Windows Server2008 R2 X64 Oracle版本&#xff1a;12c 如何安裝&#xff1f; -- oracle 12c在oracle linux 6.6 x64上的安裝 -- Windows x64位下完美安裝winx64_oracle_12c_database 如何使用DataBase Cofiguration Assistant 創建數據庫…

數據庫:Redis相關知識梳理

1、數據類型string&#xff08;字符串&#xff09;&#xff1a;最基本的k-v存儲 &#xff0c;適合驗證碼、配置信息等list&#xff08;列表&#xff09;&#xff1a;適合有序/固定的列表。比如行政區、字典表、消息隊列等。set&#xff08;集合&#xff09;&#xff1a;支持交集…

python線性回歸分析看相關性_機器學習入門-相關分析之簡單線性回歸

一.什么是機器學習&#xff1f;簡單來說&#xff0c;機器學習是一類算法的總稱&#xff0c;這些算法企圖從大量歷史數據中挖掘出其中隱含的規律&#xff0c;并用于預測或者分類&#xff0c;更具體的說&#xff0c;機器學習可以看作是尋找一個函數&#xff0c;輸入是樣本數據&am…

Android Listview 性能優化

首先我一般使用的適配器是BaseAdapter,其中有兩個方法最主要,分別是: getCount,getView,在對Listview 進行優化的時候,首先使用 convertview 和viewHolder 配合進行優化,使用convertview的母的是控件復用,從而加到減少內存的使用,使用viewHolder 的是減少findbyid 的次數.但是在…

前端:JS實現數組去重常用的六種方法介紹

今天給大家分享JS實現數組去重常用的六種方法&#xff0c;希望對大家能有所幫助&#xff01;定義變量let arr [20,6,13,20,100,8,13,11]; let newArr [];1、兩層循環去重 for(let i 0;i < arr.length;i){for(let j i 1;j < arr.length;j){if(arr[i] arr[j]){arr.sp…

python自定義colorbar_python可視化 matplotlib畫圖使用colorbar工具自定義顏色

python matplotlib畫圖使用colorbar工具自定義顏色 colorbar(draw colorbar without any mapple/plot)自定義colorbar可以畫出任何自己想要的colorbar&#xff0c;自由自在、不受約束&#xff0c;不依賴于任何已有的圖(plot/mappable)。這里使用的是mpl.colorbar.ColorbarBase類…

不能讀取文件“itunes.library.itl”因為它是由更高級別的itunes所創建的

轉自&#xff1a;https://zhidao.baidu.com/question/80796363.html 是因為你安裝過高版本的后又裝你版本的itunes. 你在電腦上搜索所有硬盤上的itunes library.itl這個文件.搜到就刪了&#xff0c;而且搜索里選擇“高級選項”除了區分大小寫其它幾個都鉤上。這樣注消下&#x…

路由器:什么是軟路由,看完本篇文章你就懂了

今天小編給大家介紹一下軟路由具體是什么&#xff0c;有什么實際用途&#xff0c;看完本篇你就懂了&#xff01; 一、軟路由與硬路由概念介紹 硬路由&#xff1a;目前我們家里普遍使用的路由器&#xff0c;有廠家提供整體的解決方案&#xff0c;包括處理器、電源供應、嵌入式軟…

c#form+mysql儲存讀取圖片_C#從SQL server數據庫中讀取l圖片和存入圖片

本實例主要介紹如何將圖片存入數據庫。將圖片存入數據庫,首先要在數據庫中建立一張表,將存儲圖片的字段類型設為Image類型,用FileStream類、BinaryReader把圖片讀成字節的形式,賦給一個字節數組,然后用ADO.SqlCommand對象的ExecuteNonQuery()方法來把數據保存到數據庫中。主要代…