日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

洛谷 P4408 逃学的小孩 解题报告

發(fā)布時間:2023/12/14 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 洛谷 P4408 逃学的小孩 解题报告 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

P4408 [NOI2003]逃學的小孩

題目描述

Chris家的電話鈴響起了,里面?zhèn)鞒隽薈hris的老師焦急的聲音:“喂,是Chris的家長嗎?你們的孩子又沒來上課,不想?yún)⒓涌荚嚵藛?#xff1f;”一聽說要考試,Chris的父母就心急如焚,他們決定在盡量短的時間內(nèi)找到Chris。他們告訴Chris的老師:“根據(jù)以往的經(jīng)驗,Chris現(xiàn)在必然躲在朋友Shermie或Yashiro家里偷玩《拳皇》游戲。現(xiàn)在,我們就從家出發(fā)去找Chris,一但找到,我們立刻給您打電話。”說完砰的一聲把電話掛了。

Chris居住的城市由N個居住點和若干條連接居住點的雙向街道組成,經(jīng)過街道x需花費Tx分鐘。可以保證,任兩個居住點間有且僅有一條通路。Chris家在點C,Shermie和Yashiro分別住在點A和點B。Chris的老師和Chris的父母都有城市地圖,但Chris的父母知道點A、B、C的具體位置而Chris的老師不知。

為了盡快找到Chris,Chris的父母會遵守以下兩條規(guī)則:

如果A距離C比B距離C近,那么Chris的父母先去Shermie家尋找Chris,如果找不到,Chris的父母再去Yashiro家;反之亦然。
Chris的父母總沿著兩點間唯一的通路行走。
顯然,Chris的老師知道Chris的父母在尋找Chris的過程中會遵守以上兩條規(guī)則,但由于他并不知道A,B,C的具體位置,所以現(xiàn)在他希望你告訴他,最壞情況下Chris的父母要耗費多長時間才能找到Chris?

輸入輸出格式

輸入格式:

輸入文件第一行是兩個整數(shù)\(N(3 ≤ N ≤ 200000)\)\(M\),分別表示居住點總數(shù)和街道總數(shù)。

以下\(M\)行,每行給出一條街道的信息。第\(i+1\)行包含整數(shù)\(U_i\)\(V_i\)\(T_i\) \((1≤U_i, V_i ≤ N,1 ≤ T_i ≤ 1000000000)\),表示街道i連接居住點\(U_i\)\(V_i\),并且經(jīng)過街道\(i\)需花費\(T_i\)分鐘。街道信息不會重復給出。

輸出格式:

輸出文件僅包含整數(shù)T,即最壞情況下Chris的父母需要花費\(T\)分鐘才能找到Chris。


我仍未具有將問題很好抽象出模型的能力,所以哪怕大家都說水,我也想到了利用樹的直徑來貪心的時候,我依舊寫爆了這個題。

\(\lmoustache E(C,A)+E(A,B),A,B,C \in G,E(C,A)<E(C,B)\)
\(\rmoustache E(C,B)+E(B,A),A,B,C \in G,E(C,A)>E(C,B)\)

模型即為求解以上的最大值。

我們關(guān)注兩條鏈如何分別取到最大值。

對于\(E_1(C,A)\)\(E_2(C,B)\),我們發(fā)現(xiàn),對任意點\(C\)\(E_1\),\(E_2\)一定是距離它最遠和次遠的兩個點。

這是什么,就是樹的直徑的兩個端點啊。(求解樹的直徑以及這是為什么可以看看NOIP2007”樹網(wǎng)的核”或者SDOI2011”消防”)

此時另一條鏈恰好不就是取到了自己的最大值?

那么枚舉直徑外每個點就好了。


code(代碼真的丑QAQ·):

#include <cstdio> #include <cstring> #define ll long long const int N=200010; ll max(ll x,ll y) {return x>y?x:y;} ll min(ll x,ll y) {return x<y?x:y;} struct Edge {ll next,to,w; }edge[N*2];ll read() {ll x=0;char c=getchar();while(c<'0'||c>'9') c=getchar();while(c>='0'&&c<='9') {x=x*10+c-'0';c=getchar();}return x; }int head[N],cnt=0; void add(ll u,ll v,ll w) {edge[++cnt].next=head[u];edge[cnt].to=v;edge[cnt].w=w;head[u]=cnt; } ll n,m; int used[N]; int l,r; ll m_max=0; void f_dfs(ll now,ll ww) {used[now]=1;if(m_max<ww){m_max=ww;l=now;}for(int i=head[now];i;i=edge[i].next){ll v=edge[i].to,w=edge[i].w;if(!used[v])f_dfs(v,w+ww);} }ll ge_dfs(ll now) {used[now]=1;ll m_max=0;for(int i=head[now];i;i=edge[i].next){ll v=edge[i].to,w=edge[i].w;if(!used[v])m_max=max(ge_dfs(v)+w,m_max);}return m_max; }int flag=1; ll f[N],w0[N],f0[N]; void b_dfs(ll now) {used[now]=1;if(now==r)flag=0;for(int i=head[now];i;i=edge[i].next){ll v=edge[i].to,w=edge[i].w;if(!used[v]&&flag){b_dfs(v);if(!flag){f[v]=now;w0[v]=w;}}} } ll ans=0; ll g[N],cnt0=0; int main() {n=read(),m=read();ll u,v,w;for(int i=1;i<=m;i++){u=read(),v=read(),w=read();add(u,v,w);add(v,u,w);}f_dfs(1,0);//求端點r=l;m_max=0;memset(used,0,sizeof(used));f_dfs(r,0);//求端點memset(used,0,sizeof(used));b_dfs(l);//構(gòu)建鏈memset(used,0,sizeof(used));int now=r;while(now){used[now]=1;g[++cnt0]=now;now=f[now];}for(int i=1;i<=cnt0;i++)f0[i]=f0[i-1]+w0[g[i-1]];for(int i=1;i<=cnt0;i++)ans=max(ans,ge_dfs(g[i])+min(f0[i],f0[cnt0]-f0[i]));printf("%lld\n",ans+f0[cnt0]);return 0; }

2018.5.24

轉(zhuǎn)載于:https://www.cnblogs.com/butterflydew/p/9083162.html

總結(jié)

以上是生活随笔為你收集整理的洛谷 P4408 逃学的小孩 解题报告的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。