大學班級選班長,n 個同學均可以發表意見
若意見為 a b 則表示 a 認為 b 合適,意見具有傳遞性,即 a 認為 b 合適,b 認為 c 合適,則 a 也認為 c 合適
勤勞的 tt 收集了m條意見,想要知道最高票數,並給出乙份候選人名單,即所有得票最多的同學,你能幫幫他嗎?
input:本題有多組資料。第一行 t 表示資料組數。每組資料開始有兩個整數 n 和 m (2 <= n <= 5000, 0 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
思想:強連通分量 縮點
實現:通過強連通分量實現縮點,同乙個強連通分量中的所有學生內部投票數相等(=n-1)
乙個學生的得票數=內部得票數+其他與之相連的強連通分量的票數
對於內部得票數:
等於內部人數-1
對於外部得票數:
等於其他指向這個學生所在的連通分量的連通分量的人數
過程: 構建原圖和反向圖
fedge和dedge
計算出每個節點對應的連通分量
利用dfs計算出圖的後序序列
根據逆後序序列遍歷反向圖,構建強連通分量
根據構建出的強連通分量進行縮點得到縮點後的圖ledge,並記錄下縮點後對應的內部節點個數
遍歷每乙個節點,通過dfs利用連通分量計算得到的投票數
找出最大投票數ansmax,並找出所有與ansmax相等的節點,輸出
總結:這個題需要用到的陣列和數比較多,在寫的時候要注意思路清晰;同時,由於是多組資料,一定要確保陣列和數初始化正確(提交發生了re原因就是有個數值沒有進行初始化)
#include
#include
#include
#include
using
namespace std;
const
int inf=
0x3f3f3f3f
;const
int maxn=
5005
;const
int maxm=
30010
;struct nodefedge[maxm]
,dedge[maxm]
,ledge[maxm]
;int fhead[maxn]
,dhead[maxn]
,lhead[maxn]
,ans[maxn]
;int vis[maxn]
,score[maxn]
,scc[maxn]
,lvis[maxn]
,dfn[maxn]
;int m,n,n,t,fnum,dnum,lnum,dcnt,scnt,ansmax;
void
add(
int x,
int y,node *edge,
int*head,
int&num)
void
lastedge()
}}void
dfs1
(int s)
void
dfs2
(int s)
void
kosaraju()
void
dfs3
(int s,
int u)}}
void
init()
intmain()
kosaraju()
;lastedge()
;for
(int i=
1;i<=scnt;i++
)for
(int i=
1;i<=scnt;i++
) ansmax=
max(ansmax,ans[i]);
cout<<
"case "
<<<
": "
true
;for
(int i=
0;icout<}return0;
}
Week8作業 C 班長競選
問題描述 大學班級選班長,n個同學均可以發表意見。若意見為a b,則表示a認為b合適。意見具有傳遞性,即a認為b合適,b認為c合適,則a也認為c合適。共m條意見,要求出最高票數和候選人名單。準備知識 kosaraju演算法 1.第一遍 dfs 確定原圖的逆後序序列。2.第二遍 dfs 在反圖中按照逆...
Week8 作業 C 班長競選
大學班級選班長,n 個同學均可以發表意見 若意見為 a b 則表示 a 認為 b 合適,意見具有傳遞性,即 a 認為 b 合適,b 認為 c 合適,則 a 也認為 c 合適 勤勞的 tt 收集了m條意見,想要知道最高票數,並給出乙份候選人名單,即所有得票最多的同學,你能幫幫他嗎?input 本題有多...
week8作業C 班長競選 kosaraju
題目 大學班級選班長,n 個同學均可以發表意見 若意見為 a b 則表示 a 認為 b 合適,意見具有傳遞性,即 a 認為 b 合適,b 認為 c 合適,則 a 也認為 c 合適 勤勞的 tt 收集了m條意見,想要知道最高票數,並給出乙份候選人名單,即所有得票最多的同學,你能幫幫他嗎?輸入 本題有多...