1. 程式人生 > 其它 >一起看 I/O | Flutter 3 更新詳解

一起看 I/O | Flutter 3 更新詳解

小 C 是 \(n\) 個學生的老師,他現在要把所有學生分成兩組,他會按照以下這些要求:

1、如果兩個同學是好朋友那麼他們就不會被分到同一組

2、小 C 想最小化兩組人數差值

現在請你寫一個程式來幫助小 C 分組,資料保證有合法的方案,如果有多種合法方案則輸出字典序最小的

輸入格式
第一行兩個整數分別表示 \(n,m\)

接下來$ m$行,每行兩個整數表示 \(x_i,y_i\)是好朋友

輸出格式
如果第 \(i\) 位學生被分到第 1 組則第 \(i\) 位為 1,反之為 2

如果有多種合法方案則輸出字典序最小的方案

資料範圍
對於 \(30\%\) 的資料,\(2 \leq n \leq 16\)

對於 \(50\%\) 的資料,\(2 \leq n \leq 100\)

對於 \(100\%\) 的資料,\(2 \leq n \leq 1000,1 \leq m \leq 100000\)

輸出時每行末尾的多餘空格,不影響答案正確性

樣例輸入

6 4
1 2
1 3
4 6
4 5

樣例輸出

122211

如果把關係看成圖論裡的邊,那麼就可以把一個連通塊分成兩部分學生,兩部分學生一邊是第一組,一邊是第二組。

可以搜尋考慮每一組的選擇情況。把所有連通塊按照最小編號的學生排完序後,每個連通塊優先讓編號最小的那一部分選擇1,其餘選擇2.過程中記錄兩組的差值。

發現搜尋過程無後效性,記錄\(dp_{i,j}\)為前i個連通塊差值為\(j-N\)

(防止負數)的情況是否列舉過。如果已經列舉過就不用再列舉一次了。複雜度O(n^2)