Week8 班長競選 強連通分量

2021-10-05 04:04:09 字數 3116 閱讀 3812

題目大意

大學班級選班長,n 個同學均可以發表意見 若意見為 a b 則表示 a 認為 b 合適,意見具有傳遞性,即 a 認為 b 合適,b 認為 c 合適,則 a 也認為 c 合適。勤勞的 tt 收集了m條意見,想要知道最高票數,並給出乙份候選人名單,即所有得票最多的同學,你能幫幫他嗎?

輸入格式

本題有多組資料。第一行 t 表示資料組數。每組資料開始有兩個整數 n 和 m (2 <= n <= 5000, 0輸出格式

對於每組資料,第一行輸出 「case x: 」,x 表示資料的編號,從1開始,緊跟著是最高的票數。 接下來一行輸出得票最多的同學的編號,用空格隔開,不忽略行末空格!

輸入樣例

243

3220

2133

1021

02

輸出樣例

case 1:2

01case 2:2012

題目分析首先解釋一下強連通分量的定義:

在有向圖g中,如果兩個頂點vi,vj間(vi>vj)有一條從vi到vj的有向路徑,同時還有一條從vj到vi的有向路徑,則稱兩個頂點強連通(strongly connected)。

如果有向圖g的每兩個頂點都強連通,稱g是乙個強連通圖。

有向圖的極大強連通子圖,稱為強連通分量(strongly connected components)。

對於這道題目,我們可以注意到這一句話:

意見具有傳遞性,即 a 認為 b 合適,b 認為 c 合適,則 a 也認為 c 合適。

所以,這道題所對應的圖,不是強連通圖,但是其中是一定有強連通分量的。

那麼怎麼獲得這個圖中的所有強連通分量呢?介紹一下kosaraju演算法:

對於上圖,我們可以根據強連通分量的定義知道一下這三個強連通分量:

kosaraju演算法的步驟:

解題思路

把這道題圖中所有的強連通分量(scc)縮成點獲得乙個新的,由scc形成的圖,那麼由於題目中描述的「票可以傳遞」,那麼對於某乙個scc中的點得到的票數就有:

即對於某乙個scc[i],其中的點的票數為:scc[i] - 1 + sum( scc[j] ),其中j可到達i。

除此之外,稍加思考,可以發現最後答案一定出現在出度為 0 的 scc

中,因此我們將邊反向,對每個入度為 0 的點進行 dfs ,計算其能到達的點的 sum( scc[j] ),即可得到答案。

所以這道題最大的困難其實是一遍遍dfs和一幅幅圖~

給出**:

#include

#include

#include

#include

#include

const

int n =

5005

;using

namespace std;

int n, m;

vector<

int>g1[n]

, g2[n]

, gx[n]

;//正向,反向,縮點圖

int dcnt, scnt;

int dfn[n]

, c[n]

;int scc[n]

;//某一scnt裡點的個數

int sccvis[n]

;//某一scnt是否遍歷到

int s_deg[n]

;//度

int vis[n]

;int maxgrade;

vector<

int>winner;

void

init()

winner.

clear()

;memset

(vis,0,

sizeof vis)

;memset

(dfn,0,

sizeof dfn)

;memset

(c,0

,sizeof c)

;memset

(scc,0,

sizeof scc)

;memset

(s_deg,0,

sizeof s_deg)

; dcnt =0;

scnt =0;

maxgrade =0;

}void

dfs1

(int x)

dfn[

++dcnt]

= x;

}void

dfs2

(int x)

}void

dfsx

(int x,

int& grade)}}

intmain()

for(

int i =

1; i <= n; i++

)for

(int i = n; i >=

1; i--)}

for(

int i =

1; i <= n; i++)}

for(

int i =

1; i <= scnt; i++)if

(the_ans >= maxgrade)

} maxgrade = the_ans;}}

}sort

(winner.

begin()

, winner.

end())

; cout <<

"case "

<<

++casenum <<

": "

<< maxgrade << endl;

for(

int i =

0; i < winner.

size()

; i++

)else}}

}

班長競選(連通分量 縮點)

大學班級選班長,n 個同學均可以發表意見 若意見為 a b 則表示 a 認為 b 合適,意見具有傳遞性,即 a 認為 b 合適,b 認為 c 合適,則 a 也認為 c 合適 勤勞的 tt 收集了m條意見,想要知道最高票數,並給出乙份候選人名單,即所有得票最多的同學,你能幫幫他嗎?輸入格式 本題有多組...

Week8作業 C 班長競選

問題描述 大學班級選班長,n個同學均可以發表意見。若意見為a b,則表示a認為b合適。意見具有傳遞性,即a認為b合適,b認為c合適,則a也認為c合適。共m條意見,要求出最高票數和候選人名單。準備知識 kosaraju演算法 1.第一遍 dfs 確定原圖的逆後序序列。2.第二遍 dfs 在反圖中按照逆...

C 班長競選(Week 8作業)

大學班級選班長,n 個同學均可以發表意見 若意見為 a b 則表示 a 認為 b 合適,意見具有傳遞性,即 a 認為 b 合適,b 認為 c 合適,則 a 也認為 c 合適 勤勞的 tt 收集了m條意見,想要知道最高票數,並給出乙份候選人名單,即所有得票最多的同學,你能幫幫他嗎?input 本題有多...