大學班級選班長,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
關於scc
scc是強連通分量,極大的強連通子圖,強連通即為有向圖g中任意兩個結點連通的圖
關於dfs序
前序:第一次達到點x的次序,用d【x】表示
後序:x點遍歷完成的次序,即回溯時間,用f【x】表示
關於kosaraju
解決問題:找到有向圖中所有的scc
方法:1、第一遍dfs確定原圖的逆後序序列
2、第二遍dfs在反圖中按照逆後序序列進行遍歷,每次由起點遍歷到的點即構成乙個scc
關於本題
1、對於同學投票,考慮求出scc並縮點,即將互相可達與單向可達分開考慮
2、縮點後,對於第i個scc的點來說,答案分為兩部分,令scc【i】表示第i個scc中點的個數,那麼第一部分為當前scc中的點,ans+=scc【i】-1(去除自己),其他scc中的點,sum(scc【j】),其中j可到達i
3、答案一定出現在出度為0的scc中,因此將邊反向,對每個入度為0的點進行dfs,計算其能到達的點sum(scc【j】)
#include
#include
#include
#include
using
namespace std;
int c[
5010
],dfn[
5010
],vis[
5010
],dcnt=
0,scnt=
0,num[
5010];
//dcnt dfs序計數,scnt scc序計數
//dfn[i]-dfs後序列中第i個點
//c[i] i號點所在scc編號
struct edge
e1[30010
],e2[
30010
],e[
30010];
//e表示縮點後的圖
int head1[
5010
],head2[
5010
],head[
5010
],sum[
5010
],tot1=
1,tot2=
1,tot=1;
int n,m;
void
addedge
(int u,
int v)
int out[
5010];
//每個點的出度
void
adds
(int u,
int v)
//縮點後的圖
void
dfs1
(int x)
void
dfs2
(int x)
int xsum;
void
dfs(
int x)
//計算得票數
}void
kosaraju()
//找到有向圖中所有的scc
}int
main()
kosaraju()
;for
(int k=
1;k<=n;k++)}
}int mmax=0;
for(
int j=
1;j<=scnt;j++)}
cout<<
"case "
<": "
<1
for(
int j=
1;j<=n;j++
)else cout<<
" "<}}
cout<}}
kosaraju 班長競選
大學班級選班長,n 個同學均可以發表意見 若意見為 a b 則表示 a 認為 b 合適,意見具有傳遞性,即 a 認為 b 合適,b 認為 c 合適,則 a 也認為 c 合適 勤勞的 tt 收集了m條意見,想要知道最高票數,並給出乙份候選人名單,即所有得票最多的同學,你能幫幫他嗎?本題有多組資料。第一...
班長競選 Kosaraju演算法
題意 大學班級選班長,n 個同學均可以發表意見 若意見為 a b 則表示 a 認為 b 合適,意見具有傳遞性,即 a 認為 b 合適,b 認為 c 合適,則 a 也認為 c 合適 勤勞的 tt 收集了m條意見,想要知道最高票數,並給出乙份候選人名單,即所有得票最多的同學,你能幫幫他嗎?input 本...
班長競選(kosaraju縮點
大學班級選班長,n 個同學均可以發表意見 若意見為 a b 則表示 a 認為 b 合適,意見具有傳遞性,即 a 認為 b 合適,b 認為 c 合適,則 a 也認為 c 合適 勤勞的 tt 收集了m條意見,想要知道最高票數,並給出乙份候選人名單,即所有得票最多的同學,你能幫幫他嗎?本題有多組資料。第一...