大學班級選班長,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:2
012
開始看到這個題以為是單純拓撲序列來做就可以,後來發現很容易出現環,並且環內各個成員相互投票,就說明某個成員的票數就等於環內成員數量-1。所以這個題要求我們先縮點,將每個強連通分量縮成乙個點後,就不再有環。
設某個強連通分量內元素的個數是scc
[i
]scc[i]
scc[i]
,縮點後,我們不難發現,對於屬於第i
ii個scc
sccsc
c的點來說,sum
=scc
[i]−
1+su
m[sc
c[j]
]sum=scc[i]-1+sum[scc[j]]
sum=sc
c[i]
−1+s
um[s
cc[j
]],其中j
jj能到達iii。
所以最終答案一定出現在出度為0的scc
sccsc
c中,我們可以將每條邊反向,然後對入度為0的點進行dfs,計算他能到達所有的點k,最終結果就是scc
[i]−
1+su
m[sc
c[k]
]scc[i]-1+sum[scc[k]]
scc[i]
−1+s
um[s
cc[k
]]。然後比較所有出度為0的點即可。
要注意的是,最終結果還要順序輸出所有的得票最高的同學,我們可以使用多個priority_queue來存每個scc中成員的負數,然後最終比較的時候統計進入另外乙個priority_queue中即可。
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
using
namespace std;
const
int maxn=
5000+10
;const
int maxm=
30000+10
;struct node
;node edge[maxm]
,edge2[maxm]
,edge3[maxn]
;//原圖,反圖,縮點反圖
int t,n,m,cnt,cnt2,cnt3,fcnt,ccnt,sum,ans;
int head[maxn]
,head2[maxn]
,head3[maxn]
,f[maxn]
,ff[maxn]
,color[maxn]
,scc[maxn]
,in_deg[maxn]
;bool vis[maxn]
;priority_queue<
int> q[maxn]
,q2;
inline
void
add(node* _edge,
int* _head,
int x,
int y,
int& _cnt)
void
dfs1
(int x)
//確定逆後序序列
f[x]
=++fcnt;
}void
dfs2
(int x)
//反圖按照逆後序遍歷染色,順便統計每種顏色的點的個數
}void
dfs3
(int x)}}
inline
void
kosaraju()
//找scc}}
inline
void
indent()
//縮點反向重構,縮圖後,圖中所有的結點都是顏色}}
}inline
void
init()
//初始化
}inline
void
solve()
//在縮完的圖中進行最終求解
ans=sum;
}else
if(ans==sum)}}
}}inline
void
print
(int _tt)
printf
("\n");
}int
getint()
while
(ch>=
'0'&& ch<=
'9')
return x*s;
}int
main()
kosaraju()
;indent()
;solve()
;print
(tt);}
return0;
}
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條意見,想要知道最高票數,並給出乙份候選人名單,即所有得票最多的同學,你能幫幫他嗎?輸入 本題有多組資料...