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...