二分+樹的直徑 [Sdoi2011]消防

問題 D: [Sdoi2011]消防
時間限制: 1 Sec 內存限制: 512 MB
提交: 12 解決: 6
[提交][狀態][討論版]
題目描述
某個國家有n個城市,這n個城市中任意兩個都連通且有唯一一條路徑,每條連通兩個城市的道路的長度為zi(zi<=1000)。
這個國家的人對火焰有超越宇宙的熱情,所以這個國家最興旺的行業是消防業。由于政府對國民的熱情忍無可忍(大量的消防經費開銷)可是卻又無可奈何(總統競選的國民支持率),所以只能想盡方法提高消防能力。
現在這個國家的經費足以在一條邊長度和不超過s的路徑(兩端都是城市)上建立消防樞紐,為了盡量提高樞紐的利用率,要求其他所有城市到這條路徑的距離的最大值最小。
你受命監管這個項目,你當然需要知道應該把樞紐建立在什么位置上。
輸入
輸入包含n行:
第1行,兩個正整數n和s,中間用一個空格隔開。其中n為城市的個數,s為路徑長度的上界。設結點編號以此為1,2,……,n。
從第2行到第n行,每行給出3個用空格隔開的正整數,依次表示每一條邊的兩個端點編號和長度。例如,“2 4 7”表示連接結點2與4的邊的長度為7。
輸出
輸出包含一個非負整數,即所有城市到選擇的路徑的最大值,當然這個最大值必須是所有方案中最小的。

樣例輸入
【樣例輸入1】
5 2
1 2 5
2 3 2
2 4 4
2 5 3
【樣例輸入2】
8 6
1 3 2
2 3 2
3 4 6
4 5 3
4 6 4
4 7 2
7 8 3
樣例輸出
【樣例輸出1】
5
【樣例輸出2】
5
提示
對于100%的數據,n<=300000,邊長小等于1000。

很容易證得,路徑一定在樹的直徑上。如果路徑拐到了另一條鏈上,明顯不最優。所以求出樹的直徑(兩遍廣搜),再一遍廣搜就可以搞出其它點到直徑的最大距離(只要把直徑上的邊權標為0),把它作為二分的下界,上屆就是樹的直徑了。二分時,只不過要舍棄掉直徑左右兩部分(長度<=mid)即可,最后判斷剩下的長度<=s即可。
現在只要證一下,只要保證直徑上舍棄的長度>=其它點到直徑的距離即可。其實這個沒啥好證的。。想想就明白了。

#pragma GCC optimize("O3")
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<queue>
#define N 300005
#define ll long long
using namespace std;
int read()
{int sum=0,f=1;char x=getchar();while(x<'0'||x>'9'){if(x=='-')f=-1;x=getchar();}while(x>='0'&&x<='9'){sum=(sum<<1)+(sum<<3)+x-'0';x=getchar();}return sum*f;
}
queue<int> q;
struct road{int v,next,l;}lu[N*2];
int n,s,e,rt1,rt2,top,adj[N],dis[N],vis[N],mark[N],from[N],zhan[N];
void add(int u,int v,int l){lu[++e]=(road){v,adj[u],l};adj[u]=e;}
void bfs(int S)
{memset(dis,-1,sizeof(dis));q.push(S);dis[S]=0;while(!q.empty()){int x=q.front();q.pop();vis[x]=0;for(int i=adj[x];i;i=lu[i].next){int to=lu[i].v;if(dis[to]==-1){from[to]=x;if(mark[to])dis[to]=dis[x];else dis[to]=dis[x]+lu[i].l;q.push(to);}}}
}
bool check(int x)
{int l=1,r=top;while(zhan[1]-zhan[l+1]<=x&&l<=top)l++;while(zhan[r-1]<=x&&r>=1)r--;return zhan[l]-zhan[r]<=s;
}
int main()
{   n=read();s=read();int x,y,z;for(int i=1;i<n;i++){x=read();y=read();z=read();add(x,y,z);add(y,x,z);}bfs(1);for(int i=1;i<=n;i++)if(dis[i]>dis[rt1])rt1=i;bfs(rt1);for(int i=1;i<=n;i++)if(dis[i]>dis[rt2])rt2=i;int D=dis[rt2];zhan[++top]=dis[rt2];mark[rt2]=1;while(rt2!=rt1){zhan[++top]=dis[from[rt2]];rt2=from[rt2];mark[rt2]=1;}bfs(rt2);int l=0,r=D;for(int i=1;i<=n;i++)l=max(l,dis[i]);if(s<D){while(l<=r){int mid=l+r>>1;if(check(mid))r=mid-1;else l=mid+1;}}printf("%d\n",l);
}

轉載于:https://www.cnblogs.com/QTY2001/p/7632632.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/371033.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/371033.shtml
英文地址,請注明出處:http://en.pswp.cn/news/371033.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

使用MRUnit測試Hadoop程序

這篇文章將略微繞開使用MapReduce實現數據密集型處理中的模式&#xff0c;以討論同樣重要的測試。 湯姆?惠勒 &#xff08; Tom Wheeler&#xff09;在紐約2012年Strata / Hadoop World會議上參加的一次演講給了我部分啟發。 處理大型數據集時&#xff0c;想到的并不是單元測試…

android之 TextWatcher的監聽

以前用過android.text.TextWatcher來監聽文本發生變化&#xff0c;但沒有仔細去想它&#xff0c;今天興致來了就發個瘋來玩玩吧&#xff01; 有點擔心自己理解錯&#xff0c;所以還是先把英文API解釋給大家看看 1、什么情況下使用了&#xff1f; When an object of a type is a…

php 秒殺并發怎么做,PHP實現高并發下的秒殺功能–Laravel

namespace App\Http\Controllers\SecKill;use App\Http\Controllers\Controller;use Exception;use Illuminate\Support\Facades\DB;use Illuminate\Support\Facades\Redis;class SecKillController extends Controller{/*** 往redis的隊列中添加庫存(用於測試的數據)**/public…

蘋果mp3軟件_優秀的Apple音樂轉換器,將任何iTunes M4P,AAX,AA轉換為MP3

Macsome iTunes Converter是一款優秀的音頻轉換工具&#xff0c;這款音頻轉換軟件能夠幫助大家快速進行音頻格式轉換&#xff0c;使得您可以自由的播放和分享自己喜愛的音頻文件。同時這款軟件與大多數音頻轉換軟件一樣&#xff0c;將受到保護DRM的Apple音樂轉換轉換成MP3, AAC…

Vuejs開發環境搭建及熱更新

一、安裝NPM 1.1最新穩定版本&#xff1a; npm install vue 二、命令行工具安裝 國內速度慢&#xff0c;使用淘寶鏡像&#xff1a; npm install -g cnpm --registryhttps://registry.npm.taobao.org 注意&#xff1a;以后使用npm的地方就替換成cnpm 1、全局安裝vue-vli ? …

線索二叉樹的C語言實現

#include "string.h"#include "stdio.h" #include "stdlib.h" #include "io.h" #include "math.h" #include "time.h" #define OK 1#define ERROR 0#define TRUE 1#define FALSE 0 #define MAXSIZE 100 /* 存儲空…

發送帶有接縫的活動邀請

這些天來&#xff0c;我的一位同事在使用帶有接縫&#xff08;2.x版&#xff09;的郵件模板發送事件邀請時遇到了問題。 從根本上講&#xff0c;這不是一個艱巨的任務&#xff0c;因此我將簡要說明使用接縫郵件模板發送事件邀請需要做什么。 發送郵件邀請時&#xff0c;您需要發…

Oracle內存管理(之二)

Oracle內存管理&#xff08;之二&#xff09; 【深入解析--eygle】 學習筆記 1.2.2 UGA和CGA UGA&#xff08;用戶全局區&#xff09;由用戶會話數據、游標狀態和索引區組成。在共享server模式下&#xff0c;一個共享服務進程被多個用戶進程共享&#xff0c;此時UGA是Shared Po…

matlab抓取股票數據,Matlab經過sina web接口獲取個數即時股票數據函數實現代碼

Matlab通過sina web接口獲取個數即時股票數據函數實現代碼代碼如下&#xff1a;function stockinfo queryprice(stocktype, stockid)%stocktype 股票類型&#xff1a;sh和sz%stockid 股票編碼&#xff1a;url sprintf(http://hq.sinajs.cn/list%s%d, stocktype, stockid);[so…

虛幻4毛發系統_虛幻引擎復活!蘋果與Epic對決,有哪些游戲險些中槍?

最近&#xff0c;蘋果和Epic的官司鬧得沸沸揚揚。隨著Epic旗下熱門手游《堡壘之夜》遭蘋果火速下架&#xff0c;兩大巨頭之間的沖突愈演愈烈。蘋果似乎并不滿足于此&#xff0c;由于Epic公開違反自家規定&#xff0c;蘋果計劃進一步封禁Epic維護虛幻引擎的開發者賬戶&#xff0…

史上最全的HTML和CSS標簽常用命名規則

文件夾主要建立以下文件夾&#xff1a;  1、Images 存放一些網站常用的圖片&#xff1b;  2、Css 存放一些CSS文件&#xff1b;  3、Flash 存放一些Flash文件&#xff1b;  4、PSD 存放一些PSD源文件&#xff1b;  5、Temp 存放所有臨時圖片和其它文件&#xff1b; …

01-JAVA語言基礎

1.設計思想&#xff1a; 先以字符串的形式輸入兩個數字&#xff0c;然后將他們轉化為int類型&#xff0c;再對兩數進行相加&#xff0c;最后輸出結果。 2.程序流程圖&#xff1a; 3.源程序代碼&#xff1a; import java.util.Scanner;public class Addition2 {public static vo…

與JodaTime的DateTime和Google Guava的供應商嘲笑

介紹 如果您是經驗豐富的單元測試人員&#xff0c;那么當您看到任何與時間 &#xff0c; 并發性 &#xff0c; 隨機性 &#xff0c; 持久性和磁盤I / O協同工作的代碼時&#xff0c;您就會學會做筆記。 原因是測試可能非常脆弱&#xff0c;有時完全無法正確測試。 這篇文章將展…

棧實現 C語言

最近上來寫了一下棧&#xff0c;理解數據結構的棧。 頭文件&#xff1a;stack.h 初始化棧結構與函數定義&#xff1a; #include<stdlib.h> #include <stdio.h> #include<memory.h> #define N 100struct stack {int data[N];int top;//標識棧頂 }; typedef s…

php簽名墻,肺功能檢查質量控制網

2017年12月2日&#xff0c;由中華醫學會呼吸病學分會/兒科分會、國家呼吸系統疾病臨床醫學研究中心、國家呼吸疾病醫療質量控制中心、中國肺功能聯盟、中國兒童肺功能協作組主辦&#xff0c;浙江省中醫院承辦的"2017年中國肺功能檢查規范化培訓及應用推廣學習班暨肺功能檢…

餐飲水單打印軟件_開發一款餐飲手機app系統軟件什么價格?有哪些方面需要考慮?...

開發一款餐飲手機app系統軟件什么價格&#xff1f;有哪些方面需要考慮&#xff1f;近年來&#xff0c;餐飲類的APP如雨后春筍般快速增長&#xff0c;無論是上檔次的酒店&#xff0c;還是各大餐廳&#xff0c;都有各自的專屬APP。餐飲APP的開發能讓大型酒店/餐廳獲得更多盈利、銷…

html5中如何去掉input type date默認

html5中如何去掉input type date默認樣式 2.對日期時間控件的樣式進行修改目前WebKit下有如下9個偽元素可以改變日期控件的UI&#xff1a;::-webkit-datetime-edit – 控制編輯區域的::-webkit-datetime-edit-fields-wrapper – 控制年月日這個區域的::-webkit-datetime-edit-…

Spring-framework應用程序啟動loadtime源碼分析筆記(二)——@Transactional

Transactional標識類或方法&#xff0c;使方法被執行時使用事務方式執行&#xff0c;這里只討論PROXY方法增強方法。使用EnableTransactionManagement&#xff0c;默認modelAdviceMode.PROXY&#xff0c;通過Import(TransactionManagementConfigurationSelector.class)來判斷在…

具有Spring的簡單工作流引擎

幾個月前&#xff0c;在處理一個公司項目時&#xff0c;我們需要開發REST服務&#xff0c;該服務用于根據客戶端應用程序發送的數據發送電子郵件。 在開發此服務期間&#xff0c;我們決定創建簡單的工作流引擎&#xff0c;該引擎將為發送電子郵件收費&#xff0c;但該引擎也可用…

php put 參數,php – 如何在Guzzle 5中發送PUT請求的參數?

根據the manual,The body option is used to control the body of an entity enclosingrequest (e.g., PUT, POST, PATCH).記錄的put’ing方法是&#xff1a;$client new GuzzleHttp\Client();$client->put(http://httpbin.org, [headers > [X-Foo > Bar],body > …