week8作業C 班長競選 kosaraju

2021-10-05 00:00:00 字數 2663 閱讀 5405

題目:

大學班級選班長,n 個同學均可以發表意見

若意見為 a b 則表示 a 認為 b 合適,意見具有傳遞性,即 a 認為 b 合適,b 認為 c 合適,則 a 也認為 c 合適

勤勞的 tt 收集了m條意見,想要知道最高票數,並給出乙份候選人名單,即所有得票最多的同學,你能幫幫他嗎?

輸入:本題有多組資料。第一行 t 表示資料組數。每組資料開始有兩個整數 n 和 m (2 <= n <= 5000, 0 3 3

1 02 1

0 2樣例輸出:

case 1: 2

0 1case 2: 2

0 1 2

本題使用kosaraju演算法,該演算法可以找到有向圖中所有的強連通分量scc。

演算法的步驟:

第一步dfs確定原圖的逆後序序列。

第二步按照逆後序序列在原圖的反向圖中進行dfs遍歷,反向圖即將原來圖中的每條有向邊反向,這樣就可以得到原圖中所有的強連通分量scc。

本題,除了使用kosaraju演算法外,還有一些地方要注意。

求出scc後進行縮點,即把所有屬於連通分量scc的點都歸於新生成的圖的一點scc,將互相可達和單向可達分開考慮。

對於原圖中每個屬於scci的點ai來說,他的票數分成兩部分,一部分是同屬於聯通分量scci的點數(除了他自己外),還有一部分是其他能單向到達該ai所在的聯通分量scci的聯通分量的點數。

所以,最後的答案一定在出度為0的scc中。

具體細節在**的注釋中。

#include

#include

#include

#include

#include

using

namespace std;

vector<

int> v1[

5100

],v2[

5100

],v3[

5100];

int countt,scc;

//count用於生成後序序列,scc用於獲得每個點所屬的強連通分量

int vis[

5100

],indegree[

5100

],dis[

5100

],temp[

5100

],ans[

5100];

int hx[

5100

],c[

5100];

//後序序列和強連通分量

vector<

int> scc_num[

5100];

//用於統計各強聯通分量中的點

void

dfs1

(int s)

} hx[countt++

]=s;

//獲得後序序列

}void

dfs2

(int s)

} scc_num[scc]

.push_back

(s);

//將屬於連通分量scc的點放入scc_num[scc]中

}void

dfs3

(int s,

int& sum)}}

intmain()

int a,b;

for(

int i=

0;i)for

(int i=

0;i)//呼叫dfs1,獲得後序序列

}for

(int i=countt-

1;i>=

0;i--

)//按照逆後續序列的順序呼叫dfs2

}for

(int i=

1;i<=scc;i++

)//初始化

for(

int i=

0;i)//縮點,把每個屬於聯通分量 i 的點合併到新圖的點 i中

}int the_max=

0,sum=0;

memset

(dis,0,

sizeof

(dis));

for(

int i=

1;i<=scc;i++

) the_max=

max(sum,the_max)

;//取最大

dis[i]

=sum;

//為每個點記錄票數

} priority_queue<

int> q;

for(

int i=

1;i<=scc;i++

)//使用優先佇列是為了按點序號的大小從小到大輸入 }}

printf

("case %d: %d\n"

,k,the_max-1)

;//the_max-1是因為把自己算進去了

int flag=1;

while

(!q.

empty()

)//輸出

else

int ans=

0-q.

top();

q.pop();

printf

("%d"

,ans);}

printf

("\n");

for(

int i=

0;i<=scc;i++)}

}

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

Week8 作業 C 班長競選

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