求一棵樹兩個點的最遠距離

2021-08-16 09:02:20 字數 2567 閱讀 3207

原題:1361 樹的最遠距離

題意

給一棵樹,求兩個點這間的距離的最大值

解析

想了很久,發現兩個點a,b也就只有幾種情況

a為b的父結點

a與b屬於同一父結點的兩條不同分支

看到題目,很多人當然會想到離root最遠的那個結點。我們現在就利用這個結點來設計演算法。

證明:最遠路一點以最遠結點為端點

如果是第一種情況,a,b為同一分支,那麼a和b同時往相反方向走到極限,便是乙個為root結點(此題為1),乙個為末結點,那麼這個末結點一定是最遠結點。

第二種情況的話,利用反證法,分兩種討論

要選兩個結點非最遠結點且與最遠結點同父結點

如果不選3而選4和5,可以看出,2通往3代替2通往5才是最優解

要選兩個結點非最遠結點且與最遠結點非同一父結點

選5和6時,改選3的話不止加上第一種情況的2~5,更是多了一段2~4,更應該選5

所以我們定下了乙個點,最遠結點。

另外乙個點就是到最遠結點的最遠的點,把最遠結點看成root結點再找一遍即可

**

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

//#include

#include

#define d long long

#define f double

#define max 0x7fffffff

#define min -0x7fffffff

#define mmm(a,b) memset(a,b,sizeof(a))

#define pb push_back

#define mk make_pair

#define fi first

#define se second

#define pill pair

#define for1(i,a,b) for(int i=a;i<=b;i++)

#define for2(i,a,b) for(int i=a;i>=b;i--)

#define ini(n) scanf("%d",&n)

#define inll(n) scanf("%lld",&n)

#define outisp(n) printf("%d ",n)

#define outllsp(n) printf("%lld ",n)

#define outiel(n) printf("%d\n",n)

#define outllel(n) printf("%lld\n",n)

using

namespace

std;

#define n 60100

#define mod ((int)1e9+7)

#define random(a,b) (rand()%(b-a+1)+a)

#define stop sleep(2000)

#define cls system("cls")

const

string el="\n";

const

string elel="\n\n";

const

string sp=" ";

const

string spsp=" ";

const

string tab="\t";

const f eps=1e-6;

int n;

int pos1,pos2;

int head[100009];

int now;

struct edgee[200009];

void add(int a,int b,int v)

int vis[100009];

struct node

};int maxlen;

int finmax(int root)

}return maxpos;

}int main()

int root=finmax(1);

finmax(root);

outiel(maxlen);}/*

61 2 2

2 3 5

2 4 1

4 5 3

4 6 2

*/

(演算法)二叉樹兩個結點的最遠距離

求二叉樹兩個結點的最遠距離。二叉樹定義如下 class treenode 遍歷每個節點,找出以當前節點為根的最長路徑,然後找出所有最長路徑中的最大值。1 class node void longestpath 1 node proot,int maxlen int rightlen if proot...

求二叉樹兩節點的最遠距離

題目要求比較簡單,寫一程式求一棵二叉樹中相距最遠的兩個節點之間的距離。其實第一眼就能相當用遞迴是最簡單也是最直觀的 以當前節點v為根的子樹中兩節點的最遠距離有三種情況 1 距離最遠的兩個節點均在v的左子樹 2 距離最遠的兩個節點均在v的右子樹 3 距離最遠的兩個節點乙個在左子樹乙個在右子樹 或者v就...

旋轉卡殼(計算凸多邊形中最遠距離的兩個點)

1978年,m.i.shamos s ph.d.的 computational geometry 標誌著電腦科學的這一領域的誕生。當時他發表成果的是乙個尋找凸多邊形直徑的乙個非常簡單的演算法,即根據多邊形的一對點距離的最大值來確定。後來直徑演化為由一對對踵點對來確定。shamos提出了乙個簡單的 o...