強連通的那點事

2022-05-02 18:03:11 字數 1151 閱讀 1530

昨晚做了一套 codeforces div.3 的題,其中有一道題【codeforces 1213f】,赤裸裸的強連通分量分解的題;

題目大意就是給你兩個陣列 p,q ,分別存放 1~n 的某個全排列;

讓你根據這兩個陣列構造乙個字串 s,要求:

(1)$\forall\ i\in [1,n-1]\ ,s_}\le s_}\ ,\ s_}\le s_}$;

(2)字串 s 至少包含 k 個不同的小寫字母;

在有向圖 g 中,如果任意兩個不同的頂點相互可達,則稱該有向圖是強連通的。

有向圖 g 的極大強連通子圖稱為 g 的強連通分支。

轉置圖的定義:將有向圖g中的每一條邊反向形成的圖稱為 g 的轉置 gt。

注意到原圖和gt的強連通分支是一樣的

[1]:挑戰程式設計競賽(第二版)4.3.1 強聯通分量分解

korasaju求有向圖強連通分支.cpp

如何根據 korasaju 解決文章開始丟擲的問題呢?

你會發現,根據題幹要求:

$\forall\ i\in [1,n-1]\ ,s_}\le s_}\ ,\ s_}\le s_}$;

建立乙個 $p_i$ 指向 $p_$ , $q_i$ 指向 $q_$ 的有向圖;

用 korasaaju 演算法計算出強連通分量的個數,假設為 t;

那麼,每個強聯通分量中的元素都必須標記為同乙個小寫字母,也就是說最多會有 t 個不同的小寫字母;

如果 t < k,直接輸出 "no";

反之,將這些強連通分量分解後形成的 dag 按照入度公升序排列;

對於前 k 個強連通分量包含的元素,依次標記為 $'a'+i\ ,\ i\in [0,k-1]$;

而對於後 t-k 個,因為題幹要求的是 $\le$,所以後 t-k 個強連通分量包含的元素可以全部標記為 $'a'+k-1$;

而這個可以通過 bfs 實現;

codeforces1213f.cpp

this的那點事

對於很多初學者,this總是搞得我們暈頭轉向。現在,我就簡單的總結一下關於this的那點事。this在函式定義時經常是不能確定的,只有在函式執行的時候才能最終確定this的歸屬。this總是指向最後呼叫它的物件,那麼怎麼知道到底是誰呼叫的呢?其實很簡單,我們知道函式呼叫的其中一種方法就是利用call...

強連通專題

求割點 無向邊 所謂的割點,就是刪除某個點,圖便不連通了。poj 1523 include include include using namespace std const int mn 1111 struct edge edge mn 2 int dfn mn intlow mn int hea...

拓展的那點事

時間過得很快,又到了公司每年的拓展時間,今年公司拓展活動是安排在崇明島,因為時間關係自己有一些瑣事不能參加,至今心裡還有一絲的眷戀。拓展訓練不是簡單的娛樂和體育活動,它的中間融合了各種挑戰的元素,這些東西一般是在大學和工作中很難學到的,有時我們看了一些書就感覺自己知道和明白這些道理,但是遇到真真的事...