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