★實驗任務
小z為競選他們村的村長,他承諾在這個村上建其地下公路來方便大家出行。
但這個地下公路有乙個奇怪的規定,每條公路上只能使用有限種交通工具,從出 發點到終點只能使用一種交通工具。現在小 z想知道從某點到另一點可以採用
多少種交通工具。
為簡化起見,為地下公路的 n個點編號,分別為 0~n-1,地下公路的交通 工具一共 c種,編號為 1~c。
★資料輸入
輸入第一行包括兩個整數,n,m,分別表示有 n個點,m條公路。接下來 m行,每行三個數 u,v,c,表示從 u到 v可以採用 c種交通工具。接著輸入 q,表示詢問個數,接下來 q行,每行兩個數 p,q,表示查詢從 p到 q有多少
種交通工具方式。
★資料輸出
對於 q個詢問,分別輸出每個詢問的結果。
解題思路:看到題目之後,根據題目所描述的總共最多十種交通工具,然後判斷每兩個點之間有幾種交通工具可以達到,可以每種交通工具下面都做乙個並查集進行查詢看這種交通工具是否可以使得兩點聯通;
並查集實現核心及易錯細節:我一般通過陣列的方式實現並查集,每個點都有乙個fa,在資料比較小的時候可以直接通過乙個fa陣列儲存每乙個點的父親節點,然後就是查詢根節點和合併兩棵子樹(集合);
查詢過程:有直接每次遞迴查詢,可根據題目需要,判斷是否需要在遞迴過程中壓縮路徑(在只需要找到每個點的根節點的時候壓縮路徑肯定會減小查詢時間的,但是如果還需要精確到每條路徑怎麼走的時候就不能壓縮路徑了)
int find_fa(int tran, int roa)
return fa[tran][roa]; //通過遞迴返回的方式將路徑壓縮
}
合併過程:在每次對兩個節點判斷做合併的時候可以通過對該節點的高度判斷哪棵樹合併到另一棵樹下面
void uni(int tran,int r1,int r2)
}
我出現的錯誤:在合併的時候直接用的是fa[r1]和fa[r2]沒有對他們進行搜尋根節點,導致整個過程一直出錯;
#include#includeint fa[11][105];
int hei[11][105] = ;
int find_fa(int tran, int roa)
return fa[tran][roa]; //通過遞迴返回的方式將路徑壓縮
}void uni(int tran,int r1,int r2)
}int main()
} for (i = 0; i < m; i++)
int que, sum = 0; scanf("%d", &que);
for (i = 0; i < que; i++)
printf("%d\n", sum);
} return 0;
}
並查集還需要多加練習; Java交通工具
請定義乙個交通工具 vehicle 的類,其中有 屬性 速度 speed 體積 size 等 方法 移動 move 設定速度 setspeed int speed 設定體積 setsize int size 加速speedup 減速speeddown 等 在測試類vehicle中的main 中例項化...
7 29交通工具類
有乙個交通工具類vehicle,將它作為基類派生出汽車類motor vehicle,再將汽車類motor vehicle 作為基類派生出小汽車類car和卡車類truck,宣告這些類並定義乙個虛函式用來顯示各類資訊。include using namespace std class vehicle p...
交通燈 並查集
相信交通燈對於你來說並不陌生,交通燈分為紅色和綠色兩個階段,這兩個階段互相更替,保障著道路的安全。在杭州一共有n 個路口,編號依次為1 到n。這些路口之間連線著m 條雙向道路,每條道路連線著兩個不同的路口,且任意兩個路口之間最多連線著一條道路。每條道路 都設定著乙個交通燈。為了保障道路的安全,對於任...