bzoj1098 鍊錶 DFS 辦公樓biu

2021-08-28 13:34:31 字數 2450 閱讀 4996

description

fgd開辦了一家**公司。他雇用了n個職員,給了每個職員一部手機。每個職員的手機裡都儲存有一些同事的

**號碼。由於fgd的公司規模不斷擴大,舊的辦公樓已經顯得十分狹窄,fgd決定將公司遷至一些新的辦公樓。fg

d希望職員被安置在盡量多的辦公樓當中,這樣對於每個職員來說都會有乙個相對更好的工作環境。但是,為了聯

系方便起見,如果兩個職員被安置在兩個不同的辦公樓之內,他們必須擁有彼此的**號碼。

input

第一行包含兩個整數n(2<=n<=100000)和m(1<=m<=2000000)。職員被依次編號為1,2,……,n.以下m行,每

行包含兩個正數a和b(1<=aoutput

包含兩行。第一行包含乙個數s,表示fgd最多可以將職員安置進的辦公樓數。第二行包含s個從小到大排列的

數,每個數後面接乙個空格,表示每個辦公樓裡安排的職員數。

sample input

7 16

1 31 4

1 52 3

3 44 5

4 74 6

5 66 7

2 42 7

2 53 5

3 71 7

sample output

1 2 4

題解

很容易想到建他的補圖,然後在補圖上求連通塊數量

補圖是個完全圖啊

我們可以大力dfs

當乙個點被訪問到的時候,把他從煉表裡去掉

鍊錶中存在的點相當於和當前的點有邊相連

乙個點只會出鍊錶一次

每條邊也只會被訪問一次

複雜度是n+m

n+mn+

m的

#include

#include

#include

#include

#include

#include

#include

#include

#include

#define ll long long

#define mp(x,y) make_pair(x,y)

using

namespace std;

inline

intread()

while

(ch>=

'0'&&ch<=

'9')

return x*f;

}inline

void

write

(int x)

inline

void

print

(int x)

vector<

int> mp[

110000];

int n,m;

int nxt[

110000

],pre[

110000];

inline

void

del(

int x)

int ans[

110000

],cnt;

bool v[

110000];

void

dfs(

int x)

}int

main()

for(

register

int i=

1;i<=n;i++

)sort

(mp[i]

.begin()

,mp[i]

.end()

);for(

register

int i=

1;i<=n;i++

)nxt[i]

=i+1

,pre[i]

=i-1

; nxt[0]

=1;pre[n+1]

=n;memset

(v,false

,sizeof

(v))

;for

(register

int i=

1;i<=n;i++)if

(!v[i]

) cnt++

,del

(i),

dfs(i)

;sort

(ans+

1,ans+

1+cnt)

;print

(cnt)

;for

(register

int i=

1;i<=cnt;i++

)print

(ans[i]);

puts(""

);return0;

}

BZOJ 1150 (堆 鍊錶)

你在一家 it 公司為大型寫字樓或辦公樓 offices 的計算機資料做備份。然而資料備份的工作是枯燥乏味 的,因此你想設計乙個系統讓不同的辦公樓彼此之間互相備份,而你則坐在家中盡享計算機遊戲的樂趣。已知辦公 樓都位於同一條街上。你決定給這些辦公樓配對 兩個一組 每一對辦公樓可以通過在這兩個建築物之...

扁平化多級雙向鍊錶(利用DFS建立新的鍊錶)

題目 多級雙向鍊錶中,除了指向下乙個節點和前乙個節點指標之外,它還有乙個子鍊錶指標,可能指向單獨的雙向鍊錶。這些子列表也可能會有乙個或多個自己的子項,依此類推,生成多級資料結構,如下面的示例所示。給你位於列表第一級的頭節點,請你扁平化列表,使所有結點出現在單級雙鏈表中。示例 1 輸入 head 1 ...

BZOJ1150 資料備份 堆 鍊錶

選出的 k kk 組一定相鄰,所以我們預處理出相鄰兩個辦公樓的間距,共 n 1 n 1 n 1 個。問題轉化為挑出 k kk 個元素,使其和盡量小且互不相鄰。假設我們選擇了其中最小的,就不能選其兩邊的 假如我們沒有選擇最小的,就一定會選擇其兩邊的,否則,將選擇的某個換成最小的會更優。建乙個鍊錶和乙個...