Kosaraju模板題 班長競選

2021-10-05 01:55:59 字數 2197 閱讀 2107

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

【輸入】

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

1 02 1

0 2【樣例輸出】

case 1: 2

0 1case 2: 2

0 1 2

關於scc

scc是強連通分量,極大的強連通子圖,強連通即為有向圖g中任意兩個結點連通的圖

關於dfs序

前序:第一次達到點x的次序,用d【x】表示

後序:x點遍歷完成的次序,即回溯時間,用f【x】表示

關於kosaraju

解決問題:找到有向圖中所有的scc

方法:1、第一遍dfs確定原圖的逆後序序列

2、第二遍dfs在反圖中按照逆後序序列進行遍歷,每次由起點遍歷到的點即構成乙個scc

關於本題

1、對於同學投票,考慮求出scc並縮點,即將互相可達與單向可達分開考慮

2、縮點後,對於第i個scc的點來說,答案分為兩部分,令scc【i】表示第i個scc中點的個數,那麼第一部分為當前scc中的點,ans+=scc【i】-1(去除自己),其他scc中的點,sum(scc【j】),其中j可到達i

3、答案一定出現在出度為0的scc中,因此將邊反向,對每個入度為0的點進行dfs,計算其能到達的點sum(scc【j】)

#include

#include

#include

#include

using

namespace std;

int c[

5010

],dfn[

5010

],vis[

5010

],dcnt=

0,scnt=

0,num[

5010];

//dcnt dfs序計數,scnt scc序計數

//dfn[i]-dfs後序列中第i個點

//c[i] i號點所在scc編號

struct edge

e1[30010

],e2[

30010

],e[

30010];

//e表示縮點後的圖

int head1[

5010

],head2[

5010

],head[

5010

],sum[

5010

],tot1=

1,tot2=

1,tot=1;

int n,m;

void

addedge

(int u,

int v)

int out[

5010];

//每個點的出度

void

adds

(int u,

int v)

//縮點後的圖

void

dfs1

(int x)

void

dfs2

(int x)

int xsum;

void

dfs(

int x)

//計算得票數

}void

kosaraju()

//找到有向圖中所有的scc

}int

main()

kosaraju()

;for

(int k=

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

}int mmax=0;

for(

int j=

1;j<=scnt;j++)}

cout<<

"case "

<": "

<1

for(

int j=

1;j<=n;j++

)else cout<<

" "<}}

cout<}}

kosaraju 班長競選

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

班長競選 Kosaraju演算法

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

班長競選(kosaraju縮點

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