【并查集】打击犯罪(ssl 2342)
打擊犯罪
ssl 2342
題目大意:
有n個(gè)人某些人之間有連接(連接成一個(gè)團(tuán)伙),現(xiàn)在要最大的團(tuán)伙人數(shù)不大于n/2,要最少要?jiǎng)h掉幾個(gè)人(要按順序刪)
原題:
題目描述:
某個(gè)地區(qū)有n(n<=1000)個(gè)犯罪團(tuán)伙,當(dāng)?shù)鼐桨凑账麄兊奈kU(xiǎn)程度由高到低給他們編號(hào)為1-n,他們有些團(tuán)伙之間有直接聯(lián)系,但是任意兩個(gè)團(tuán)伙都可以通過(guò)直接或間接的方式聯(lián)系,這樣這里就形成了一個(gè)龐大的犯罪集團(tuán),犯罪集團(tuán)的危險(xiǎn)程度唯一由集團(tuán)內(nèi)的犯罪團(tuán)伙數(shù)量確定,而與單個(gè)犯罪團(tuán)伙的危險(xiǎn)程度無(wú)關(guān)(該犯罪集團(tuán)的危險(xiǎn)程度為n)。現(xiàn)在當(dāng)?shù)鼐较MūM量少的時(shí)間(即打擊掉盡量少的團(tuán)伙),使得龐大的犯罪集團(tuán)分離成若干個(gè)較小的集團(tuán),并且他們中最大的一個(gè)的危險(xiǎn)程度不超過(guò)n/2。為達(dá)到最好的效果,他們將按順序打擊掉編號(hào)1到k的犯罪團(tuán)伙,請(qǐng)編程求出k的最小值。
輸入
第一行一個(gè)正整數(shù)n
接下來(lái)的n行每行有若干個(gè)正整數(shù),第一個(gè)整數(shù)表示該行除第一個(gè)外還有多少個(gè)整數(shù),若第i行存在正整數(shù)k,表示i,k兩個(gè)團(tuán)伙可以直接聯(lián)系
輸出
一個(gè)正整數(shù),為k的最小值
輸入樣例
7 2 2 5 3 1 3 4 2 2 4 2 2 3 3 1 6 7 2 5 7 2 5 6輸出樣例
1解題思路:
因?yàn)槭前错樞虼驌舻?#xff0c;所以倒著循環(huán),每次添加一個(gè)人,如果沒(méi)超過(guò)那繼續(xù),如果超過(guò)了就直接輸出
代碼:
#include<cstdio> using namespace std; int n,x,y,pp,p[1005],dad[1005],s[1005],b[1005][1005]; int find(int dep){return dad[dep]==dep?dep:dad[dep]=find(dad[dep]);} //并查集 int main() {scanf("%d",&n);for (int i=1;i<=n;++i){scanf("%d",&b[i][0]);for (int j=1;j<=b[i][0];++j)scanf("%d",&b[i][j]);s[i]=1;//預(yù)處理dad[i]=i;}for (int i=n;i>0;--i){p[i]=1;for (int j=1;j<=b[i][0];++j)//合并其他的if (find(i)!=find(b[i][j])&&p[b[i][j]]){x=find(i);y=find(b[i][j]);if (x>y){dad[y]=x;s[x]+=s[y]; //累加}else{dad[x]=y;s[y]+=s[x];}}for (int j=i;j<=n;++j)if (s[j]>n/2)//判斷符不符合{printf("%d",i);pp=1;break;}if (pp) break;} }總結(jié)
以上是生活随笔為你收集整理的【并查集】打击犯罪(ssl 2342)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: TCL 华星介绍小米 14 / Pro
- 下一篇: 【并查集】银河英雄传说 (luogu 1