2015程式設計之美 彩色的樹

2021-07-02 03:08:08 字數 1586 閱讀 4890

題目1 : 彩色的樹

時間限制:2000ms

單點時限:1000ms

記憶體限制:256mb

描述給定一棵n個節點的樹,節點編號為1, 2, …, n。樹中有n - 1條邊,任意兩個節點間恰好有一條路徑。這是一棵彩色的樹,每個節點恰好可以染一種顏色。初始時,所有節點的顏色都為0。現在需要實現兩種操作:

1. 改變節點x的顏色為y;

2. 詢問整棵樹被劃分成了多少棵顏色相同的子樹。即每棵子樹內的節點顏色都相同,而相鄰子樹的顏色不同。

輸入第一行乙個整數t,表示資料組數,以下是t組資料。

每組資料第一行是n,表示樹的節點個數。接下來n - 1行每行兩個數i和j,表示節點i和j間有一條邊。接下來是乙個數q,表示運算元。之後q行,每行表示以下兩種操作之一:

1. 若為"1",則詢問劃分的子樹個數。

2. 若為"2 x y",則將節點x的顏色改為y。

輸出每組資料的第一行為"case #x:",x為測試資料編號,從1開始。

接下來的每一行,對於每乙個詢問,輸出乙個整數,為劃分成的子樹個數。

資料範圍

1 ≤ t ≤ 20

0 ≤ y ≤ 100000

小資料1 ≤ n, q ≤ 5000

大資料1 ≤ n, q ≤ 100000

樣例輸入23

1 22 331

2 2 115

1 22 3

2 42 541

2 2 1

2 3 2

1樣例輸出

case #1:13

case #2:15

#include #include #include using namespace std;

//利用hash_map儲存邊資訊,利用vector儲存節點的顏色資訊, 時間複雜度:o(nlogn)

int main()

//cout<<"matrix.size="<>oper_n;

int option = 0;

int nodeth = 0, color = 0;

bool no2flag = false;

bool again1flag = false;

for(int j=0; j>option;

if(option == 1 && !no2flag) //一直沒有節點顏色改變的情況

cout<<1<::iterator iter; //multimap的迭代器

if(count)

iter = matrix.find(k); //尋找第一條與子節點的邊

while(count--)

}if(!sameflag) //此節點沒有顏色相同的相鄰節點的情況

result++; //子樹個數加1

}cout<>nodeth>>color;

node[nodeth-1] = color; //修改此節點的顏色值

no2flag = true; //修改節點顏色改變的標誌

again1flag = false; //不再連續出現1命令}}

matrix.clear();

} }return 0;

}

程式設計之美15 彩色的樹

看第一眼以為這個題不好做,把過多的時間浪費在第二題上了。彩色的樹 這題是乙個頂點染色的問題,用點dfs去不斷染色,然後記錄子樹的個數就好,題目的內容如下 給定一棵n個節點的樹,節點編號為1,2,n。樹中有n 1條邊,任意兩個節點間恰好有一條路徑。這是一棵彩色的樹,每個節點恰好可以染一種顏色。初始時,...

程式設計之美2015初賽A

時間限制 2000ms 單點時限 1000ms 記憶體限制 256mb 兩個數a和 b a第一行為乙個數t,為資料組數。之後每組資料報含兩行。第一行為n,為集合s的大小。第二行為n個整數,表示集合內的數。對於每組資料輸出一行,形如 case x y x為資料編號,從1開始,y為最大的子集的大小。1 ...

程式設計之美2015資格賽

時間限制 2000ms 單點時限 1000ms 記憶體限制 256mb 給定兩個日期,計算這兩個日期之間有多少個2月29日 包括起始日期 1.年份能被4整除但不能被100整除 2.年份能被400整除 第一行為乙個整數t,表示資料組數。之後每組資料報含兩行。每一行格式為 month day,year ...