NOI2003 逃學的小孩

2022-05-31 04:18:11 字數 1651 閱讀 2952

傳送門:>here

<

題意:給出一棵樹(帶權),要從乙個節點c先走到距離它近的乙個節點b,再走到a,要求最壞情況下的總路程(即最長)。

解題思路:

乍一看,a,b,c都沒給出,這怎麼求?

不妨設距離c較近的點位a。

分析發現,無論怎樣,a~b是一定要走的。那麼如何能讓樹上任意兩點間距離最大呢?不難發現a,b就是該樹直徑的兩個端點。那麼只要兩遍bfs就好了。

那麼如何讓a~c的路程最長呢?注意到a到c相較a到b是較短的。所以好像不怎麼好求……但是可以列舉——列舉每個點作為c到a和b的距離,求出較小的那個,並且打擂得到最大值。

code

/*

by qixingzhi

*/#include

#include

#include

#include

#include

#include

#define r read()

#define max(a,b) (((a)>(b)) ? (a) : (b))

#define min(a,b) (((a)<(b)) ? (a) : (b))

using

namespace

std;

typedef

long

long

ll;#define int ll

const

int n = 200010

;const

int inf = 1061109567

;inline

intread()

struct

edge;

intn,m,x,y,z,a,b,ans,ans2;

intd[n], d2[n], vis[n];

vector

g[n];

queue

q;inline

void addedge(int u, int v, int

w)inline

void bfs(int

s) }

}}inline

void bfs2(int

s) }

}}main()

bfs(1);

int __max = -100

;

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

}ans =__max;

memset(vis,

0,sizeof

(vis));

bfs(a);

__max = -100

;

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

}ans =__max;

memset(vis,

0,sizeof

(vis));

bfs2(b);

for(int i = 1; i <= n; ++i) ans2 =max(ans2, min(d[i], d2[i]));

printf(

"%lld

", ans+ans2);

return0;

}

NOI2003 逃學的小孩

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

NOI2003 逃學的小孩

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

NOI2003 逃學的小孩 題解

前言 原題傳送門 洛谷 看了一下洛谷題面,這道noi的題竟然是藍的 惡評?做了一下好像確實是藍的.解法 思路非常簡單,找道樹的直徑,然後答案是直徑長度加上最大的min dis pos1 dis pos2 pos1和pos2是指定的任意一條直徑的兩個端點,dis是距離 證明 鑑於這是一棵樹 原題面 可...