HDU 1558:Segment set, 計算幾何+並查集

來源:互聯網
上載者:User

題目連結:

http://acm.hdu.edu.cn/showproblem.php?pid=1558

題目類型: 計算集合 , 並查集

題目:

A segment and all segments which are connected with it compose a segment set. The size of a segment set is the number of segments in it. The problem is to find the size of some segment set.

Sample Input

1 10 P 1.00 1.00 4.00 2.00 P 1.00 -2.00 8.00 4.00 Q 1 P 2.00 3.00 3.00 1.00 Q 1 Q 3 P 1.00 4.00 8.00 2.00 Q 2 P 3.00 3.00 6.00 -2.00 Q 5

Sample Output

1 2 2 2 5

題目大意:

輸入幾條線段,線段由座標上的兩點組成, 每一點有x,y,代表x軸和y軸對應的值。

當輸入為Q  k時, 輸出與第k條直線直接或間接有相連的線段條數。

分析與總結:

這一題是並查集比較基礎的應用, 但是這題的關鍵在於判斷兩條直線是否相交。

斷兩線段是否相交的方法:     我們分兩步確定兩條線段是否相交:

1. 快速排斥實驗:設以線段 P1P2 為對角線的矩形為R, 設以線段 Q1Q2 為對角線的矩形為T,如果R和T不相交,顯然兩線段不會相交。

2. 跨立實驗:如果兩線段相交,則兩線段必然相互跨立對方。 若P1P2跨立Q1Q2 ,則向量 ( P1 - Q1 ) 和( P2 - Q1 )位於向量( Q2 - Q1 ) 的兩側,即: (( P1 - Q1 ) × ( Q2 - Q1 )) * (( P2 - Q1 ) × ( Q2 - Q1 )) < 0。(利用了向量叉積) 當 ( P1 - Q1 ) × ( Q2 - Q1 ) = 0 時,說明 ( P1 - Q1 ) 和 ( Q2 - Q1 )共線,但是因為已經通過快速排斥實驗,所以 P1 一定線上段 Q1Q2上;同理,( Q2 - Q1 ) ×(P2 - Q1 ) = 0 說明 P2 一定線上段 Q1Q2上。

所以判斷P1P2跨立Q1Q2的依據是:(( P1 - Q1 ) × ( Q2 - Q1 )) * (( Q2 - Q1 ) × ( P2 - Q1 )) >= 0。 同理判斷Q1Q2跨立P1P2的依據是:(( Q1 - P1 ) × ( P2 - P1 )) * (( P2 - P1 ) × ( Q2 - P1 )) >= 0。

具體情況如下圖所示:(這裡利用了向量叉積來判斷兩個向量是否位於另一向量的兩側) 注意:只有同時滿足以上兩個條件,即相互跨立對方,兩個線段才相交。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.