題目的大概意思是只要兩個線段連在一起就可以算在乙個集合裡面,問第k條直線處在的集合中有多少條直線。
假設在已知判斷線段相交的方法的情況下,把一條新的直線放到平面上的時候,我們把這條直線和之前的所有直線判定一遍,假若相交,則合併這兩個集合,因為n<=1000,頂多也只有1000條直線,時間還是可以承受的。。況且假若不一一比較的話,也沒什麼簡單的辦法來獲得我們需要的資訊。。。
接下來就是解決判定線段相交的問題了,借用了演算法導論上的辦法,以下是**:
#include#include#include#includeusing namespace std;
typedef pairpoint;
struct line;
}te,arr[1010];
int t,n,qu,cou=1,sets[1010],sz[1010];
char c;
int _find(int x)
bool _merge(int x,int y),judge(const line&,const line&),on_segment(const point&,const point&,const point&);
double direction(const point&,const point&,const point&);
int main()
else
double direction(const point&a,const point&b,const point& c)
bool on_segment(const point&a,const point&b,const point& c)
函式說明:_find函式是查詢元素同時自帶路徑壓縮的寫法
_merge函式用於合併兩個集合,其實在這裡返回值完全可以不要,只是我利用返回值找出了編寫時的乙個小bug。
judge函式用於判斷兩個線段是否相交,我為了迎合演算法導論上的寫法,所以引數是那麼寫的,,當然了,要直接拿去用也可以。
direction函式和on_segment函式也解釋一下吧,direction函式用於返回兩個向量的叉積,具體的演算法導論上面有,大概意思就是判斷方向,要求兩條向量各在兩側
on_segment函式用於處理一條線段的端點恰好處於另一條線段上的情況
hdu 1558 線段相交判斷 並查集
2535437 2010 06 12 00 42 04 accepted 1558 109ms 256k 2695 b c t t include include include using namespace std struct point struct sdlxd 1002 int p 100...
hdu1558 並查集 判斷線段相交
簡單的計算幾何題,判斷兩線段是否相交。將相交的兩線段使用並查集歸到一類中。查詢時輸出線段對應集合中元素的個數。includestruct point struct segmentnode 1010 int n,parent 1010 int getabs int value int getparen...
hdu1558並查集 線段相交
hdu1558 關於線段相交的內容參考演算法導論p577 include include includeusing namespace std int pre 1010 sum 1010 struct point struct edge edge 1010 int e 邊數 int find int...