題目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 ...