BZOJ1509 NOI2003 逃學的小孩

2022-02-06 02:38:31 字數 1591 閱讀 8681

第一行是兩個整數n(3  n  200000)和m,分別表示居住點總數和街道總數。以下m行,每行給出一條街道的資訊。第i+1行包含整數ui、vi、ti(1ui, vi  n,1  ti  1000000000),表示街道i連線居住點ui和vi,並且經過街道i需花費ti分鐘。街道資訊不會重複給出。

僅包含整數t,即最壞情況下chris的父母需要花費t分鐘才能找到chris。

4 31 2 1

2 3 1

3 4 1

4肯定會選樹的直徑,然後其他點列舉一下,取到直徑兩端距離的最小值的最大值,然後加上樹的直徑就是答案。

#include #include 

#include

#include

#include

using

namespace

std;

#define int long long

#define g getchar()

#define i isdigit(ch)inline

intread()

return

res;

}#undef g

#undef i

#define n 200005

intn, m;

struct

edgeed[n*2

];int

head[n], cnt;

inline

void add(int x, int y, intz);

head[x] =cnt;

}int

dis[n], disa[n], disb[n];

intp1, p2;

intans1, ans2;

bool

ex[n];

void dfs(intx)}

inline

void spfa1(int

cur)}}

}}inline

void spfa2(int

cur)}}

}}signed main()

dfs(1);

p1 = 1

;

for (int i = 1 ; i <= n ; i ++) if (dis[i] > dis[p1]) p1 =i;

memset(dis,

0, sizeof

dis);

memset(ex,

0, sizeof

ex);

dfs(p1);

p2 = 1

;

for (int i = 1 ; i <= n ; i ++) if (dis[i] > dis[p2]) p2 =i;

spfa1(p1);

spfa2(p2);

ans1 =disa[p2];

for (int i = 1 ; i <= n ; i ++)

ans2 =max(ans2, min(disa[i], disb[i]));

printf(

"%lld\n

", ans1 +ans2);

return0;

}

NOI2003 逃學的小孩

演算法 最短路 樹的直徑 難度 noip 注意 多年oi一場空,不開long long見祖宗!如果不開long long,應該會被卡到60分!注意 dfs找樹的直徑時,傳的引數 d 也要開long long哦!首先,因為無論如何答案都會包括a到b的dis,所以我們先用2遍dfs找到dis a b 的...

NOI2003 逃學的小孩

傳送門 here 題意 給出一棵樹 帶權 要從乙個節點c先走到距離它近的乙個節點b,再走到a,要求最壞情況下的總路程 即最長 解題思路 乍一看,a,b,c都沒給出,這怎麼求?不妨設距離c較近的點位a。分析發現,無論怎樣,a b是一定要走的。那麼如何能讓樹上任意兩點間距離最大呢?不難發現a,b就是該樹...

NOI2003 逃學的小孩

chris家的 鈴響起了,裡面傳出了chris的老師焦急的聲音 喂,是chris的家長嗎?你們的孩子又沒來上課,不想參加考試了嗎?一聽說要考試,chris的父母就心急如焚,他們決定在盡量短的時間內找到chris。他們告訴chris的老師 根據以往的經驗,chris現在必然躲在朋友shermie或ya...