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