The Longest Path 兩種解法

2022-04-07 09:26:49 字數 2247 閱讀 4671

view code

/*

【題目**】

&cid=567

【題目分析】

給定一些邊確定乙個圖,即給定一些點之間的連通情況,保證給定的圖沒有迴路,要求輸出該圖存在的最長路徑。

【思路分析】

. 根據給定資訊構造圖,用鄰接表表示。(鄰接矩陣明顯很麻煩且效率不高)

. 將每乙個頂點看成是樹根,求出樹的高度。

. 得到一系列樹的高度,最大的那個就是圖中存在的最長路徑。嗯對的。

【陷阱分析】

.不應該被資料矇騙,比如只給兩條邊但頂點不一定是1,2,3而有可能是1,99,100之類,所以陣列開最大(題目範圍1-100,所以開個105絕對夠了)

【小小感受】

用vector構造鄰接表確實比較方便~ 學習了

*/#include

#include

#include

#include

#include

using

namespace

std;

#define max 105

intmain()

int ans = 0

;

//廣搜咯~~~~ 求樹的高度

for (int i = 1, j = 1; j < 3; j++)

;memset(visit,

0, sizeof

(visit));

queue

q;q.push(i);

visit[i] = 1

;

while (!q.empty())

i =current;

}int max = *max_element(height, height+max);//

該點作為樹根時樹的高度

if (ans < max) ans = max;//

更新最大值

}

cout

<< ans <

}}

view code

/*

受喬幫主提點,這道題果然有更簡單的做法

【思路分析】

通俗來講,把給定的圖看成是一串珠子,隨便拿起其中一顆,吊起來,那麼再拿起此時這串珠子最下面的那顆,再吊起來

ok,那麼這時這串珠子的高度就是這一整個圖存在的最長路徑。

好神奇。

我自己粗略的證明 :

隨便拿起的這顆記為a,最底下那顆記為b。

拿起a:

此時b一定是最長路徑裡面的一點。

注意,此時a到b之間必定至少有2點是屬於最長路徑的,即除了b外還至少有一點c,並且這一點c在 a 到 a和b的中間。(若有多點,則c取最高的那一點)

(為什麼c不能在b 到 a和b的中間呢,反證一下即可)

離c最遠的點現在必定是b

拿起b:

現在離c最遠的必定是最低的那點d,所以綜合c在最長路徑上,c離b最遠,可得出bd為最長路徑。

【小小疑問】

既然開始時是隨機選一點,我還是不知道為什麼選1就對,選temp2就不對。

*/#include

#include

#include

#include

#include

using

namespace

std;

#define max 105

intmain()

int ans = 0

;

//迴圈2次就行啦~~~

for (int i = 1, j = 1; j < 3; j++)

;memset(visit,

0, sizeof

(visit));

queue

q;q.push(i);

visit[i] = 1

;

while (!q.empty())

i =current;

}int max = *max_element(height, height+max);//

該點作為樹根時樹的高度

if (ans < max) ans = max;//

更新最大值

}

cout

<< ans <}}

執行緒兩加兩減

print?package com.thread 設計4個執行緒,其中兩個執行緒對j加1,另外兩個對j減1 public class threadtest2 加1方法 public synchronized void inc 減1方法 public synchronized void dec 加1的...

兩兩交換兩個相鄰節點

給定乙個鍊錶,兩兩交換其中相鄰的節點,並返回交換後的鍊錶。如 給定1 2 3 4,返回2 1 4 3。說明 方法一 交換兩個節點裡的值而節點不動。該題禁止這樣做 方法二 老老實實的交換就好了 我的 if head null return head if head.next null return h...

兩數之和 兩樹相加

給定乙個整數陣列 nums 和乙個目標值 target,請你在該陣列中找出和為目標值的那 兩個 整數,並返回他們的陣列下標。你可以假設每種輸入只會對應乙個答案。但是,陣列中同乙個元素不能使用兩遍。示例 給定 nums 2,7,11,15 target 9 因為 nums 0 nums 1 2 7 9...