hihocoder 1541 相交的鐵路線

2021-08-21 22:14:11 字數 1400 閱讀 9588

時間限制:10000ms

單點時限:1000ms

記憶體限制:256mb

h國有 n 個城市,編號1..n。城市間有n-1條鐵路,保證任意兩個城市可以通過鐵路互達,且路線唯一。

現有 m 次詢問,每次詢問兩條鐵路線是否相交(有共同經過的城市或鐵路)。

第一行乙個數 t,表示資料組數

對於每一組資料:

第一行兩個數n, m

第2~n行,每行兩個數x, y表示有一條鐵路連線城市 x 和 y

接下來m行每行四個數,x1, y1, x2, y2 表示詢問城市 x1 和 y1 之間的路線是否和城市 x2 和 y2 之間的路線相交。

對於40%的資料,1 ≤ n, m ≤ 100  

對於60%的資料,1 ≤ n, m ≤ 1000

對於100%的資料,1 ≤ t ≤ 10, 1 ≤ n, m ≤ 100000 1 ≤ x, y, x1, y1, x2, y2 ≤ n

對於每次詢問輸出yes或no

樣例輸入

1

4 21 2

2 33 4

1 2 3 4

1 4 2 3

樣例輸出

no

yes

emacsnormalvim

題解:emm,我們定義x1,y1的lca為t1,x2,y2的lca為t2,不難發現,如果要有相交,t1和t2一定是祖孫關係(不是祖孫關係即不在同一顆子樹內,顯然這樣永遠也不會相交)。

那麼這樣就好辦了。分類討論一下,當t1為t2的祖先,那麼滿足lca(t2,x1)==t2||lca(t2,y1)==t2即有相交(表示t2位於x1到t1的路徑上或位於y1到t1的路徑上)。t2為t1祖先亦然。

**(打起來還是很容易的):

#includeusing namespace std;

int n,m,tot,e[500001],head[500001],nexr[500001],dep[500001],f[100001][21];

void build(int t,int k)

void dfs(int x,int fa)

}int lca(int x,int y)

return f[x][0];

}int main()

dep[1]=1;

memset(f,0,sizeof(f));

dfs(1,-1);

for(j=1;j<=20;j++)

for(i=1;i<=n;i++)f[i][j]=f[f[i][j-1]][j-1];

while(m--)

else if(lca(t1,x2)==t1||lca(t1,y2)==t1)puts("yes");

else puts("no"); }}

}

160 相交鍊錶

編寫乙個程式,找到兩個單鏈表相交的起始節點。如下面的兩個鍊錶 在節點 c1 開始相交。示例 1 輸入 intersectval 8,lista 4,1,8,4,5 listb 5,0,1,8,4,5 skipa 2,skipb 3 輸出 reference of the node with valu...

160 相交鍊錶

題目描述 題目問題和難點 1.是找相交的那個節點,而不是值相等的節點。示例中1的值相同但不是相交的節點 2.此題目不考慮有環的鍊錶所以思路很簡單。public static listnode getintersectionnode listnode heada,listnode headb 1.獲取...

160相交鍊錶

題目描述 編寫乙個程式,找到兩個單鏈表相交的起始節點。沒有就返回null。注意 題解思路 從a鍊錶第乙個元素開始,去遍歷b鍊錶,找到乙個相同元素後,同步遍歷a和b鍊錶,所有元素相同,即兩個鍊錶為相交鍊錶,並返回同步遍歷的起始節點。struct listnode getintersectionnode...