【問題描述】
有n個結點(編號為1..n),初始時每個結點的父親都不存在。你的任務是執行一次i操作和e操作,格式如下:
i u v:把節點u的父親點設定為v,距離為|u-v|除以1000的餘數。輸入保證執行指令前u沒有父親節點。
e u:詢問u 到根接點的距離(輸出距離 mod 1000的結果)。
【輸入格式】
輸入第一行為測試資料組數t。每組資料第一行為n(5<=n<=20 000)。接下來有不超過20000行,每一行一條指令,以"o"結尾。i指令的個數不小於n。
【輸出格式】
對於每條e指令,輸出查詢結果(輸出距離 mod 1000的結果)。
【輸入樣例】 14
e 3i 3 1
e 3i 1 2
e 3i 2 4
e 3o
【輸出樣例】 02
35【資料範圍】
5≤n≤20000
【**】
《大白書》192頁 uva 1329
解題思路:該題是一道典型的使用並查集解決的問題。根據題意,並查集中需要記錄結點的父親和結點到父親的距離(為了方便之後的運算)。當把節點u的父親設定成v時,直接計算出它們的距離存進陣列中。需要注意的是,為了節省時間,在並查集的查詢中進行了路徑壓縮(使得乙個集合中的每個元素的父親都為根結點),在壓縮的同時,結點到父親的距離也要改變。
#include#include#include#include#include#include#include#includeusing namespace std;
const int maxn=20005;
int t,n,u,v;
char s[10];
int pa[maxn],d[maxn]; //d[i] i到父親的距離
void initial()
void bing(int u,int v)
int find(int x)
int main()
if(s[0]=='e')
scanf("%s",s);
} }return 0;
}
《大白書》192頁 uva 1329 合作網路
問題描述 有n個結點 編號為1.n 初始時每個結點的父親都不存在。你的任務是執行一次i操作和e操作,格式如下 i u v 把節點u的父親點設定為v,距離為 u v 除以1000的餘數。輸入保證執行指令前u沒有父親節點。e u 詢問u 到根接點的距離 輸出距離 mod 1000的結果 輸入格式 輸入第...
UVA 11825 集合列舉 狀態壓縮 dp
列舉子集的飄逸寫法 這個裡面先處理出來選擇某台計算機可以覆蓋到的計算機的範圍。選擇某個計算機集合可以覆蓋到的計算機的範圍 dp s 代表選擇某個計算機集合,最多可以覆蓋多少次全集。dp s max dp s dp s0 s 1 s0 是s 的子集,s0 s 是s0 在 s 中的補集。include ...
UVa 12096 集合棧計算機
這題的話,我們讀入操作之後,首先對於空集就是初始化為空。我們可以使用typedef 對於 set 重新命名為set,這樣就可以直接用set 的語法進行空集的初始化了。這題主要是對於集合的處理,我們可以給集合乙個對映函式,這個函式對於已知集合就返回該id,讓主函式進行相應的操作。對於未知集合就按序存入...