班長競選(kosaraju縮點

2021-10-05 03:45:19 字數 2857 閱讀 9664

大學班級選班長,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:2

012

開始看到這個題以為是單純拓撲序列來做就可以,後來發現很容易出現環,並且環內各個成員相互投票,就說明某個成員的票數就等於環內成員數量-1。所以這個題要求我們先縮點,將每個強連通分量縮成乙個點後,就不再有環。

設某個強連通分量內元素的個數是scc

[i

]scc[i]

scc[i]

,縮點後,我們不難發現,對於屬於第i

ii個scc

sccsc

c的點來說,sum

=scc

[i]−

1+su

m[sc

c[j]

]sum=scc[i]-1+sum[scc[j]]

sum=sc

c[i]

−1+s

um[s

cc[j

]],其中j

jj能到達iii。

所以最終答案一定出現在出度為0的scc

sccsc

c中,我們可以將每條邊反向,然後對入度為0的點進行dfs,計算他能到達所有的點k,最終結果就是scc

[i]−

1+su

m[sc

c[k]

]scc[i]-1+sum[scc[k]]

scc[i]

−1+s

um[s

cc[k

]]。然後比較所有出度為0的點即可。

要注意的是,最終結果還要順序輸出所有的得票最高的同學,我們可以使用多個priority_queue來存每個scc中成員的負數,然後最終比較的時候統計進入另外乙個priority_queue中即可。

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

using

namespace std;

const

int maxn=

5000+10

;const

int maxm=

30000+10

;struct node

;node edge[maxm]

,edge2[maxm]

,edge3[maxn]

;//原圖,反圖,縮點反圖

int t,n,m,cnt,cnt2,cnt3,fcnt,ccnt,sum,ans;

int head[maxn]

,head2[maxn]

,head3[maxn]

,f[maxn]

,ff[maxn]

,color[maxn]

,scc[maxn]

,in_deg[maxn]

;bool vis[maxn]

;priority_queue<

int> q[maxn]

,q2;

inline

void

add(node* _edge,

int* _head,

int x,

int y,

int& _cnt)

void

dfs1

(int x)

//確定逆後序序列

f[x]

=++fcnt;

}void

dfs2

(int x)

//反圖按照逆後序遍歷染色,順便統計每種顏色的點的個數

}void

dfs3

(int x)}}

inline

void

kosaraju()

//找scc}}

inline

void

indent()

//縮點反向重構,縮圖後,圖中所有的結點都是顏色}}

}inline

void

init()

//初始化

}inline

void

solve()

//在縮完的圖中進行最終求解

ans=sum;

}else

if(ans==sum)}}

}}inline

void

print

(int _tt)

printf

("\n");

}int

getint()

while

(ch>=

'0'&& ch<=

'9')

return x*s;

}int

main()

kosaraju()

;indent()

;solve()

;print

(tt);}

return0;

}

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