題目大意
大學班級選班長,n 個同學均可以發表意見 若意見為 a b 則表示 a 認為 b 合適,意見具有傳遞性,即 a 認為 b 合適,b 認為 c 合適,則 a 也認為 c 合適。勤勞的 tt 收集了m條意見,想要知道最高票數,並給出乙份候選人名單,即所有得票最多的同學,你能幫幫他嗎?
輸入格式
本題有多組資料。第一行 t 表示資料組數。每組資料開始有兩個整數 n 和 m (2 <= n <= 5000, 0輸出格式
對於每組資料,第一行輸出 「case x: 」,x 表示資料的編號,從1開始,緊跟著是最高的票數。 接下來一行輸出得票最多的同學的編號,用空格隔開,不忽略行末空格!
輸入樣例
243
3220
2133
1021
02
輸出樣例
case 1:2
01case 2:2012
題目分析首先解釋一下強連通分量的定義:
在有向圖g中,如果兩個頂點vi,vj間(vi>vj)有一條從vi到vj的有向路徑,同時還有一條從vj到vi的有向路徑,則稱兩個頂點強連通(strongly connected)。對於這道題目,我們可以注意到這一句話:如果有向圖g的每兩個頂點都強連通,稱g是乙個強連通圖。
有向圖的極大強連通子圖,稱為強連通分量(strongly connected components)。
意見具有傳遞性,即 a 認為 b 合適,b 認為 c 合適,則 a 也認為 c 合適。所以,這道題所對應的圖,不是強連通圖,但是其中是一定有強連通分量的。
那麼怎麼獲得這個圖中的所有強連通分量呢?介紹一下kosaraju演算法:
對於上圖,我們可以根據強連通分量的定義知道一下這三個強連通分量:
kosaraju演算法的步驟:
解題思路
把這道題圖中所有的強連通分量(scc)縮成點獲得乙個新的,由scc形成的圖,那麼由於題目中描述的「票可以傳遞」,那麼對於某乙個scc中的點得到的票數就有:
即對於某乙個scc[i],其中的點的票數為:scc[i] - 1 + sum( scc[j] ),其中j可到達i。
除此之外,稍加思考,可以發現最後答案一定出現在出度為 0 的 scc
中,因此我們將邊反向,對每個入度為 0 的點進行 dfs ,計算其能到達的點的 sum( scc[j] ),即可得到答案。
所以這道題最大的困難其實是一遍遍dfs和一幅幅圖~
給出**:
#include
#include
#include
#include
#include
const
int n =
5005
;using
namespace std;
int n, m;
vector<
int>g1[n]
, g2[n]
, gx[n]
;//正向,反向,縮點圖
int dcnt, scnt;
int dfn[n]
, c[n]
;int scc[n]
;//某一scnt裡點的個數
int sccvis[n]
;//某一scnt是否遍歷到
int s_deg[n]
;//度
int vis[n]
;int maxgrade;
vector<
int>winner;
void
init()
winner.
clear()
;memset
(vis,0,
sizeof vis)
;memset
(dfn,0,
sizeof dfn)
;memset
(c,0
,sizeof c)
;memset
(scc,0,
sizeof scc)
;memset
(s_deg,0,
sizeof s_deg)
; dcnt =0;
scnt =0;
maxgrade =0;
}void
dfs1
(int x)
dfn[
++dcnt]
= x;
}void
dfs2
(int x)
}void
dfsx
(int x,
int& grade)}}
intmain()
for(
int i =
1; i <= n; i++
)for
(int i = n; i >=
1; i--)}
for(
int i =
1; i <= n; i++)}
for(
int i =
1; i <= scnt; i++)if
(the_ans >= maxgrade)
} maxgrade = the_ans;}}
}sort
(winner.
begin()
, winner.
end())
; cout <<
"case "
<<
++casenum <<
": "
<< maxgrade << endl;
for(
int i =
0; i < winner.
size()
; i++
)else}}
}
班長競選(連通分量 縮點)
大學班級選班長,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合適。共m條意見,要求出最高票數和候選人名單。準備知識 kosaraju演算法 1.第一遍 dfs 確定原圖的逆後序序列。2.第二遍 dfs 在反圖中按照逆...
C 班長競選(Week 8作業)
大學班級選班長,n 個同學均可以發表意見 若意見為 a b 則表示 a 認為 b 合適,意見具有傳遞性,即 a 認為 b 合適,b 認為 c 合適,則 a 也認為 c 合適 勤勞的 tt 收集了m條意見,想要知道最高票數,並給出乙份候選人名單,即所有得票最多的同學,你能幫幫他嗎?input 本題有多...