大學班級選班長,n 個同學均可以發表意見 若意見為 a b 則表示 a 認為 b 合適,意見具有傳遞性,即 a 認為 b 合適,b 認為 c 合適,則 a 也認為 c 合適 勤勞的 tt 收集了m條意見,想要知道最高票數,並給出乙份候選人名單,即所有得票最多的同學,你能幫幫他嗎?
input在這個題目中,如果a給b投票,我們可以轉化成在圖中的一條邊。這樣通過不斷的加邊,我們就可以找出所有的強連通分量,然後對所有的強連通分量進行縮點處理。本題有多組資料。第一行 t 表示資料組數。每組資料開始有兩個整數 n 和 m (2 <= n <= 5000, 0 3 3
1 02 1
0 2sample output
case 1: 2
0 1case 2: 2
0 1 2
在求scc的時候使用的是kosaraju演算法,可以通過兩遍dfs實現,第一遍求出原圖中的逆後序序列,第二遍dfs在反圖中按照逆後序序列進行遍歷,求出scc。
在求完scc後,我們需要做的是縮點操作,將處在同乙個scc中的所有點看成1個點,然後縮點之後找到出度為0的點,然後從這個點在縮點反圖中進行dfs遍歷,找到所有可以到達這個點的其他點。這裡需要注意最後的結果不止乙個,有兩種情況,一是當前scc中的點,ans+=scc[i]–1,二是其它scc中的點sum( scc[j]),其中點j可到達點i。
#include
#include
#include
using
namespace std;
#define _for(i,a,b) for(int i = (a); i < (b); i++)
#define _rep(i,a,b) for(int i = (a); i <= (b); i++)
const
int maxn =
5100
;const
int maxm =
30100
;int f[maxn]
,nf[maxn]
;int vis1[maxn]
,vis2[maxn]
,scc[maxn]
,scc2[maxn]
,in_deg[maxn]
;int t,n,s,mx;
int fcnt,acnt1,acnt2,acnt3,scnt;
int a,b;
int head1[maxn]
,head2[maxn]
,head3[maxn]
;int ans[maxn]
,ans2[maxn]
;struct edgee1[maxm]
,e2[maxm]
,e3[maxn]
;void
inia()
void
addedge
(int x,
int y,
int cs)
else
if(cs ==2)
else
}void
dfs1
(int s)
f[++fcnt]
= s;
}void
dfs2
(int s)
}void
kosaraju()
}}void
dfs3
(int x)}}
void
print()
else cout <<
" "<< i;}}
cout << endl;
}int
main()
cout<<
"case "
<": "
;kosaraju()
;_for
(i,0
,n)}
mx =0;
_rep
(i,1
,scnt)
}_rep
(i,1
,scnt)
cout << mx << endl;
print()
;}}
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 本題有多...