1. 程式人生 > >最近公共祖先(並查集)

最近公共祖先(並查集)

 
#include<stdio.h>
#include<cstdlib>
#include<iostream>
#include<cstdio>
#include<vector>
#include<cstring>
#include<stack>
#include<queue>
using namespace std;
typedef long long LL;
int par[10010];//父親
int ra[10010], rb[10010];
queue<int>road;

void init(int n) {
	for (int i = 0; i <= n; i++) {
		par[i]=i;
	}
}

int Find1(int x) { //不需要記錄路徑的查詢
	if (par[x] == x)return x;
	else {
		return Find1(par[x]);
	}
}

int Find(int x) {  //需要記錄路徑的查詢
	road.push(x);
	if (par[x] == x)return x;
	else {
		return Find(par[x]);
	}
}

void unite(int a, int b) {
	if (Find1(a) == Find1(b))return;
	par[b] = a; //不能按照並查集那樣合併  find也不需要壓縮路徑
}

int main() {
	int Case;
	scanf_s("%d", &Case);
	while (Case--) {
		int n; scanf_s("%d", &n);
		init(n);
		for (int i = 0; i < n - 1; i++) {
			int a, b;
			scanf_s("%d%d", &a, &b);
			unite(a, b);
		}//建立並查集
		int a, b;
		scanf_s("%d%d", &a, &b);
		int ia = -1, ib = -1;
		while (!road.empty())road.pop();
		Find(a);
		while (!road.empty()) {
			ra[++ia] = road.front();
			road.pop();
		}//路程放入陣列
		Find(b);
		while (!road.empty()) {
			rb[++ib] = road.front();
			road.pop();
		}//路程放入陣列
		while (ia >= 0 && ib >= 0) {
			if (ra[ia] == rb[ib]) { ia--; ib--; }
			else { printf("%d\n", ra[ia + 1]); break; }
		}
		if (ia < 0)printf("%d\n", rb[ib + 1]);
		else if (ib < 0)printf("%d\n", ra[ia + 1]);
	}
}



相關推薦

最近公共祖先

 #include<stdio.h> #include<cstdlib> #include<iostream> #include<cstdio> #include<vector> #include<cstring> #include<

hihocoder 1067 最近公共祖先·二 +stl

題目連結: 題解思路: 面對10^5個 名字和10^5條詢問,肯定要用到特殊的方法: 1.把所有的詢問先存下來,然後再遍歷一次整棵樹得到所有答案 2.遍歷的過程中   查詢含當前節點的 所有詢問,然後找到詢問中的另一個節點;檢視另一個節點的狀態。     

Codeforces 325 D-Reclamation

name clam .cn 每次 .html con ret ring true 借用 鏈接 的題意和解法分析的圖片。 對於這種環的形式,先用常用的手段復制一份在右邊。每次加點的過程只要看加完之後能不能通過已有的格子聯通,如果聯通則顯然已經形成了一個環。這裏判斷聯通我

[luoguP2342] 疊積木

() click hide open closed include tps 技術 char 傳送門 up[i] 表示一個木塊上面有多少個 all[i] 表示整個連通塊內有多少個 那麽 一個木塊下面的木塊個數為 all[root[i]] - up[i] - 1

hdu5652:India and China Origins

and std map printf etc scanf 16px 兩個 for   倒序操作用並查集判斷是否連通,新技能get√(其實以前就會了   這題細節很多。。。搞得整個程序都是調試輸出,幾度看不下去想要重寫   並查集到現在大概掌握了兩個基本用途:判斷是否連通 /

POJ 2492 A Bug's Life

ont set -1 flat com rom init red least Background Professor Hopper is researching the sexual behavior of a rare species of bugs. He assum

LA 3027 Corporative Network

using namespace while += fin clas 都是 ont roo 有n個點,一開始都是孤立的,然後有I,E兩種操作 I u v,把u的父節點設為v,距離為abs(u-v) % 1000,保證u之前沒有父節點 E 詢問u到根節點

HDU 1232 暢通工程

while name style queue input 結束 inf long 城市 某省調查城鎮交通狀況,得到現有城鎮道路統計表,表中列出了每條道路直接連通的城鎮。省政府“暢通工程”的目標是使全省任何兩個城鎮間都可以實現交通(但不一定有直接的道路

uva live 7638 Number of Connected Components

txt 通過 open main eps div cte efi ive 題目鏈接:https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=show_

The Suspects

self 一點 rate nim 節點 lists tran 並查集 arc 個人心得:最基礎的並查集經典題。借此去了解了一下加深版的即加權並查集,比如食物鏈的題目,這種題目實行起來還是有 一定的難度,不僅要找出與父節點的關系,還要在路徑壓縮的時候進行更新,這一點現在還是沒

POJ-1118 食物鏈

ace scan problem tro sca sam 我們 %d 很好 食物鏈 Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 75814 Accepted: 22528

CodeForces 445B. DZY Loves Chemistry

word other res 技術分享 increase ted weight hit next 轉載請註明出處:http://blog.csdn.net/u012860063?viewmode=contents 題目鏈接:http://codeforces.co

[BZOJ3712]Fiolki 重構樹

sample size 不知道 沈澱 過程 表示 deep hellip long 3712: [PA2014]Fiolki Time Limit: 30 Sec Memory Limit: 128 MB Description 化學家吉麗想要配置一種神奇的

Farm Irrigation HDU - 1198

i++ 灌溉 pan isp hdu color img 二進制表示 clu Farm Irrigation HDU - 1198 題意:給11種管道,問草地最少需要打多少個井才可以全部灌溉。 把每種管道的狀態用二進制表示一下,然後對每一塊草地,判斷能否和上面或者左面

Building Block HDU - 2818

freopen return 記錄 scanf splay else 一次 == gif Building Block HDU - 2818 題意:搬磚。。。每一次可以把a所在的那一堆放到b所在的那一堆上面,問第x號磚下面有幾塊磚。 記錄一下到根節點的距離(dw),以

bzoj1015:[JSOI2008]星球大戰starwar

ocp smu diy http tex pcc cpp collect tgz 7Q顯19J穎纜賾95拾妨http://www.zcool.com.cn/collection/ZMTg3MzQxNjA=.html h等XKlejV鋅叫斬http://www.zcool.

BZOJ-1854-[Scoi2010]遊戲

isp 樹形結構 scanf for 數據 描述 ++ define day Description lxhgww最近迷上了一款遊戲,在遊戲裏,他擁有很多的裝備,每種裝備都有2個屬性,這些屬性的值用[1,10000]之間的數表示。當他使用某種裝備時,他只能使用該裝備的某一

[Bzoj1821][JSOI2010]Group 部落劃分 Group二分答案

ble 輸出 content 有意 表示 com 自己 clu 我們 1821: [JSOI2010]Group 部落劃分 Group Time Limit: 10 Sec Memory Limit: 64 MBSubmit: 2949 Solved:

poj1611 The Suspects

con oid sca mes using ++ 如果 problem urn 題目鏈接 http://poj.org/problem?id=1611 題意 有n個學生,編號0~n-1,m個社團,每個社團有k個學生,如果社團裏有1個學生是SARS的疑似患者,則該社團所

Codeforces 915F Imbalance Value of a Tree

路徑 second long long air bit force 題意 for href 題目鏈接 Imbalance Value of a Tree 題意 給定一棵樹。求樹上所有簡單路徑中的最大權值與最小權值的差值的和。 首先考慮求所有簡單路徑中的最大權值