班長競選 Kosaraju演算法

2021-10-05 03:36:40 字數 3006 閱讀 6240

題意

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

input

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

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

sample input

24 3

3 22 0

2 13 3

1 02 1

0 2sample output

case 1: 2

0 1case 2: 2

0 1 2

解題思路

我們可以知道,1投票給2,2投票給3,那麼3得到了2票。

所以乙個連通分量裡面的所有點的票數都是相同的。

所以我們可以把連通分量壓縮成點,然後可以知道 : 最大票數的點肯定在出度為0的點上,如果我們把壓點後的圖給求個反圖,那麼就是入度為0的點裡存在最大的票。

強連通分量(scc)

利用kosaraju演算法求scc

壓點後求反圖,然後計算最大票數

kosaraju演算法: dfs1次求逆後序序列,根據逆後序序列dfs遍歷染色scc。

**實現

#include

#include

#include

#define nmax 5005

#include

using

namespace std;

vector<

int> g1[nmax]

, g2[nmax]

, g3[nmax]

;//g1--原圖 g2--反圖 g3--scc的反圖

int n, m, a, b;

bool vis[nmax]

;int scc_size;

//scc的個數

int c[nmax]

;//該點屬於哪個scc

int reder;

//染色scc

int dfn[nmax]

;//記錄序列

int dfni;

//索引

int sum[nmax]

;//入度為0 的scc的票數

int degree[nmax]

;//入度

bool g3vis[nmax]

[nmax]

;//g3存反圖時避免重複存入 / 標記

struct scc

;//縮點

scc scc[nmax]

;void

add(

int u,

int v,

int g)

//g=1時加g1,g==2時加g2 ,g==3時加g3

void

dfs1

(int x)

//求後序列

void

dfs2

(int x)

//遍歷逆後序列

void

buildg()

//構造圖

}void

ini(

)//初始化

for(

int i =

0; i <= scc_size; i++

) dfni =0;

reder =0;

scc_size=0;

}void

kosaraju()

//dfs 逆後序 ,得到scc

for(

int i = n-

1; i >=

0; i--)if

(c[dfn[i]]==

0)++reder,

dfs2

(dfn[i]);

//reder染色scc

}void

suodian_and_g3()

//縮點和建立g3}}

}}//scc求反圖是為了這裡好求票數

intdfs3

(int x)

//求第i個scc的票數

return ans;

}int

main()

}int smax =0;

for(

int i =

1; i <= scc_size; i++

)//找出最大的

int res[nmax]

;//答案

int resi =0;

for(

int i =

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

}sort

(res, res + resi)

;printf

("case %d: %d\n"

,count,smax)

;printf

("%d"

,res[0]

);for(

int i =

1; i < resi; i++

)printf

("\n");

ini();

}return0;

}

小結kosaraju演算法是乙個很精妙的演算法,2遍dfs可以求出不同顏色的scc,然後把scc壓點,取壓點後的圖的反圖,便於dfs3求得sum,然後把最大的壓點scc,提取出來他的點,排序後輸出。

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條意見,想要知道最高票數,並給出乙份候選人名單,即所有得票最多的同學,你能幫幫他嗎?輸入 本題有多組資料...

班長競選(kosaraju縮點

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