week8作業題 C 班長競選

2021-10-05 09:57:47 字數 2086 閱讀 2345

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

input

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

1 02 1

0 2sample output

case 1: 2

0 1case 2: 2

0 1 2

在這個題目中,如果a給b投票,我們可以轉化成在圖中的一條邊。這樣通過不斷的加邊,我們就可以找出所有的強連通分量,然後對所有的強連通分量進行縮點處理。

在求scc的時候使用的是kosaraju演算法,可以通過兩遍dfs實現,第一遍求出原圖中的逆後序序列,第二遍dfs在反圖中按照逆後序序列進行遍歷,求出scc。

在求完scc後,我們需要做的是縮點操作,將處在同乙個scc中的所有點看成1個點,然後縮點之後找到出度為0的點,然後從這個點在縮點反圖中進行dfs遍歷,找到所有可以到達這個點的其他點。這裡需要注意最後的結果不止乙個,有兩種情況,一是當前scc中的點,ans+=scc[i]–1,二是其它scc中的點sum( scc[j]),其中點j可到達點i。

#include

#include

#include

using

namespace std;

#define _for(i,a,b) for(int i = (a); i < (b); i++)

#define _rep(i,a,b) for(int i = (a); i <= (b); i++)

const

int maxn =

5100

;const

int maxm =

30100

;int f[maxn]

,nf[maxn]

;int vis1[maxn]

,vis2[maxn]

,scc[maxn]

,scc2[maxn]

,in_deg[maxn]

;int t,n,s,mx;

int fcnt,acnt1,acnt2,acnt3,scnt;

int a,b;

int head1[maxn]

,head2[maxn]

,head3[maxn]

;int ans[maxn]

,ans2[maxn]

;struct edgee1[maxm]

,e2[maxm]

,e3[maxn]

;void

inia()

void

addedge

(int x,

int y,

int cs)

else

if(cs ==2)

else

}void

dfs1

(int s)

f[++fcnt]

= s;

}void

dfs2

(int s)

}void

kosaraju()

}}void

dfs3

(int x)}}

void

print()

else cout <<

" "<< i;}}

cout << endl;

}int

main()

cout<<

"case "

<": "

;kosaraju()

;_for

(i,0

,n)}

mx =0;

_rep

(i,1

,scnt)

}_rep

(i,1

,scnt)

cout << mx << endl;

print()

;}}

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 本題有多...

Week8 作業 C 班長競選

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