week8 C 班長競選

2021-10-05 03:13:53 字數 1794 閱讀 4429

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

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

2

4 33 2

2 02 1

3 31 0

2 10 2

case 1: 2

0 1case 2: 2

0 1 2

本題考察強連通分量,採用kosaraju演算法來找到所有的強連通分量

在存圖的時候不僅要存原圖,還要存反圖,為了從dfs逆後序序列中進行反圖dfs時確定出所有的scc

首先經過一次dfs找到dfs的後序序列

然後將後序序列反向進行反圖的dfs,此時由起點到達的所有點構成乙個scc

統計每個scc的中的人數存到num陣列中

之後再對原圖進行一次dfs,確定所有能到達某乙個scc的所有scc存入pre陣列中

之後找到出度為0的點a(出度為0的人,支援他的人數最多),對於此點所在的scc i,tmp陣列儲存支援他的人數,temp[a]+=num[i]-1

對於pre[i]中的scc j:temp[a]+=num[j]

最後統計出得票最高的票數 ma,再將票數為ma的人的編號全部輸出即可

#include#include#include#include#include#includeusing namespace std;

const int maxn=5100;

int n,c[maxn],dfn[maxn],vis[maxn],dcnt,scnt,num[maxn],n1[maxn];

//dcnt-dfs序計數,scnt-scc計數

//dfn[i]-dfs後序列中第i個數

//c[i]-i號節點所在scc編號

//num-票數,n1-每個scc的人數

vectorg1[maxn],g2[maxn],pre[maxn];//g1-原圖,g2-反圖,pre-到達此scc的scc序號

void dfs1(int x)

}void nu(int tmp,int x,int vi)

for(int i=0;iif(vis[i]!=2)

dfs3(i);

}int main()

int a,b;

while(m--)

k();

memset(n1,0,sizeof(n1));

for(int i=1;i<=scnt;i++)

for(int j=0;jif(c[j]==i)

n1[i]++;

for(int i=0;iint ma=-1;

for(int i=0;ima=max(ma,num[i]);

printf("case %d: %d\n", l, ma);

int tmp[maxn],co=0;

for(int i=0;iif(num[i]==ma)

tmp[co++]=i;

for(int i=0;iprintf("\n");

} return 0;

}

程式設計Week8 C 班長競選

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

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