時間限制: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
noemacsnormalvimyes
題解: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...