大學班級選班長,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 本題有多...