程式設計Week8 C 班長競選

2021-10-05 04:04:09 字數 2304 閱讀 6771

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

本題有多組資料。第一行 t 表示資料組數。每組資料開始有兩個整數 n 和 m (2 <= n <= 5000, 0 對於每組資料,第一行輸出 「case x: 」,x 表示資料的編號,從1開始,緊跟著是最高的票數。 接下來一行輸出得票最多的同學的編號,用空格隔開,不忽略行末空格!

由於得票具有傳遞性,因此這道題就會變成一道強連通分量的問題,首先肯定是根據kosaraju演算法來求圖中scc,再將scc縮點,不難發現,得票最多的同學所在的scc,必然是出度為0的scc,因此由縮點後的scc構建乙個新的圖,並將原本scc連線的邊反向,然後從入度為0的scc開始求解,最後就能得到最高票數,再遍歷scc,找的票數等於最高票數的scc,將該scc內的點存入set中(去重、排序),最後輸出set內的點即可。

整個流程可以分為:

kosaraju演算法:找乙個圖的所有scc

具體的操作和變數資訊見**注釋。

#include

#include

#include

#include

using

namespace std;

vector<

int> g1[

5020

],g2[

5020

],g3[

5020];

//原圖與反圖,g3是scc的反向圖

vector<

int> member[

5020];

//記錄每個scc中的點

int dfn[

5020

],dcnt,c[

5020

],scnt,degree[

5020

],ans[

5020

],maxn=-1

;//dfn是後序序列,dcnt是dfs後序計數,ci是第i個點所屬的scc號,scnt是scc計數

//degree是每個scc的入度(反向後) ,ans是每個點獲得的票數,maxn是得票最多的scc

bool vis[

5020

],vis2[

5020];

//vis標記第一次dfs時有沒有到達過,vis2標記對scc進行dfs時,每個scc有沒有到達過

set<

int> a;

//最後輸出的最大的票數的人

void

init

(int n)

dcnt=0;

scnt=0;

a.clear()

; maxn=0;

}void

dfs1

(int x)

dfn[dcnt++

]=x;

}void

dfs2

(int x)

}void

kosaraju

(int n)

for(

int i=n-

1;i>=0;

--i)}}

void

scaling

(int n)}}

}int

dfs3

(int x)

return sum;

}void

solve()

}}void

people()

}}void

output

(int t)

cout<}int

main()

kosaraju

(n);

scaling

(n);

solve()

;output

(i);

}return0;

}

這道題我個人認為是一道蠻複雜的題目,乍一看似乎要做好多操作,但如果仔細分析就能將所有的操作流程寫出來,就像解題思路中寫的那樣,事實上這道題求解scc是比較簡單的,求解完成後如何獲得最大票數和最大得票人是較麻煩的一點,將scc縮點再建圖,然後進行搜尋是很巧妙的一步(反正如果是模測,我可能是想不到的,想到可能也寫不完)。

另外,對這種操作流程很長的題目,模組化求解,將每乙個操作模組化成乙個函式,是十分有利的,不僅能理清思路,閱讀起來也比較清晰,debug較為方便。

最後,這種變數很多還有很多組資料的時候,初始化一定要仔細,不要漏掉某個變數(比如這段**中的maxn),否則debug很難受(感謝幫我測資料debug的小夥伴)。

week8 C 班長競選

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

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