C 班長競選

2021-10-06 20:18:30 字數 1787 閱讀 2386

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

從圖中找出所有強連通分量進行縮點,那麼首先某乙個強連通分量中的人獲得了該強連通分量中節點數目減一得票數。他們還會獲得其他與之相連的強連通分量的票數。

計算出每個節點對應的連通分量:利用dfs計算出圖的後序序列,根據逆後序序列遍歷反向圖,構建強連通分量,根據構建出的強連通分量進行縮點得到縮點後的圖,並記錄下縮點後對應的內部節點個數,遍歷每乙個節點,通過dfs利用連通分量計算得到的投票數,找出最大投票數,並找出對應的的節點。

#include

#include

using

namespace std;

const

int n =

5010

;const

int m =

30010

;int head1[n]

, head2[n]

, head[n]

, ind[n]

, c[n]

, dfn[n]

, vis[n]

, scc[n]

, judge[n]

, belong[n]

;int inx, num, dcnt, scnt, tot1, tot2, tot;

struct edge e1[m]

, e2[m]

, e[m]

;void

add1

(int x,

int y)

//原圖

void

add2

(int x,

int y)

//反圖

void

add(

int x,

int y)

//縮點圖

void

dfs1

(int x)

dfn[

++dcnt]

= x;

}void

dfs2

(int x)

}void

dfs(

int x)

}void

kosaraju

(int n)

}void

spt(

int n)

//構造縮點圖}}

void

solve

(int n)

}printf

("case %d: %d\n"

, inx, maxn)

; inx++

;memset

(judge,0,

sizeof

(judge));

for(

int i =

1; i <= scnt; i++)if

(belong[i]

== maxn)

judge[i]=1

;int ix =0;

for(

int i =

0; i < n; i++)}

printf

("\n");

}void

ini(

)int

main()

solve

(n);

}}

C 班長競選

大學班級選班長,n 個同學均可以發表意見 若意見為 a b 則表示 a 認為 b 合適,意見具有傳遞性,即 a 認為 b 合適,b 認為 c 合適,則 a 也認為 c 合適,給出m個意見,找到得票最多的人 dfs求出每個點所在的連通分量,然後縮點,並記錄縮點之後每個點的入度 要將圖反向 遍歷得到每個...

kosaraju 班長競選

大學班級選班長,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 合適 勤勞的 tt 收集了m條意見,想要知道最高票數,並給出乙份候選人名單,即所有得票最多的同學,你能幫幫他嗎?本題有多組資料。第一...