NOI2003 逃學的小孩

2021-08-28 08:22:10 字數 1216 閱讀 4939

演算法:最短路+樹的直徑

難度:noip

注意:多年oi一場空,不開long long見祖宗!         如果不開long long,應該會被卡到60分!

注意:dfs找樹的直徑時,傳的引數「d」也要開long long哦!!!

首先,因為無論如何答案都會包括a到b的dis,所以我們先用2遍dfs找到dis(a->b)的最大值(即:樹的直徑);

然後我們來考慮答案的另一部分:c到a/b的最大值,既然我們已經找到了樹的直徑的兩個端點u,v,我們只需以u,v跑兩遍spfa,找到maxn,累加到ans身上即可。

偽**:

maxn=max(maxn,1ll*min(dis[i],diss[i]));
**如下:

#include #include #include #include #include #include #include #include #define ll long long

#define n 200005

using namespace std;

struct node

edge[n<<1];

int head[n],vis[n];

ll dis[n];

int cnt=1;

void init()

void add(int u,int v,int w)

void spfa(int rt)

dfs(to,dis[to]);

} }}int main()

viss[1]=1;

dfs(1,0);

va1=chan;

memset(viss,0,sizeof(viss));

viss[chan]=1;

dfs(chan,0);

va2=chan;

if(va2==va1) va2=1;

spfa(va1);

ll maxn=0;

spfaa(va2);

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

ans+=maxn;

printf("%lld\n",ans);

return 0;

}

NOI2003 逃學的小孩

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

NOI2003 逃學的小孩

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

NOI2003 逃學的小孩 題解

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