描述
由於 a 學校生物實驗室裡那個不負責的資料分析員, 實驗室的病毒威力被錯誤估算,導致了可怕的病毒洩漏,現在病毒即將在校園內傳播開來。
校園裡一共有 n 個建築物, 生物實驗室總是位於一號建築物且在 0 時刻受到病毒入侵。這 n 個建築物由 m 條單向道路相連(也有可能有建築物被孤立) 。每條道路有兩個資訊:它的長度,它是多少年前修建的。當乙個建築物被病毒入侵,從被入侵的時刻起, 病毒會從所有由這個建築物通向其他建築物的道路按著這條道路的方向以 1 個單位每秒的速度行進。
校長得知這個事情後, 決定放棄這個學校逃跑。 校長總是位於編號為 n 的行政樓,從零時刻開始需要共 t 秒來逃出行政樓,且逃出行政樓即視為逃出了這個學校。也就是說,如果病毒入侵行政樓的時間不小於 t,則校長能夠成功逃離。
有些時候,校長沒有足夠的時間逃離,因為病毒到達行政樓的時間太快了。
為了讓校長能夠逃離學校, 不得不拆除校園內的一些道路以延緩行政樓的被入侵時間(拆除道路視為在 0 時刻被拆的道路全部消失) 。當然,如果使得病毒根本無法到達行政樓,也是可以的。
但是, 拆除道路會影響學校的歷史氣息,且破壞程度定義為拆除的道路中最古老的一條的年齡。請求出保證校長能夠安全撤離的情況下,最小的破壞程度。
輸入 第一行包含三個整數:n, m, t。
接下來 m 行,每行描述一條有向道路。每行 4 個整數,si, ti, li, yi,分別表
示這條道路的起點,終點,長度,這條道路的年齡。
輸出 如果不需要拆除任何道路,輸出一行兩個數:-1 和行政樓的被感染時刻(當然
這個時刻大於等於 t) ,以空格隔開。
否則輸出一行包含乙個數:最小的破壞程度。
樣例一
delay.in
5 5 15
1 2 6 35
2 4 8 40
1 3 6 45
3 4 3 25
4 5 5 50
delay.out
25 【樣例一說明】
每條邊上的黑字對應這條路的長度,紅字對應年齡。校長將在第 15 秒逃出學校,如果不拆除任何道路,行政樓將在第 14 秒受到入侵。你可以拆除 4 到 5 的道路,使得行政樓免於入侵,這樣的破壞程度是 50。但是最好的方法是拆掉 3 到 4 之間的道路,這樣使得行政樓在第 19 秒受到入侵,校長就可以逃離了。
樣例一
delay.in
3 2 10
1 2 5 30
2 3 6 50
delay.out
-1 11
【資料範圍】
對於 20%的資料,n, m<=10
對於 60%的資料,n, m<=100.
對於 100%的資料,n<=20000, m<=100000.
資料保證在不拆除任何道路的情況下,從 1 號樓到 n 號樓一定存在路徑。
#include
#include
#include
#include
#include
using
namespace
std;
struct holdere[100005];
int head[100005],n,m,t,dis[100005],vis[100005];
struct datadata[100005];
int cmp(data a,data b)
int spfa()}}
}}void initialize()
void read()
}int judge(int x)
spfa();
if(dis[n]>=t)else
}void bisection()else
}cout
}int main()
NOIP2012 疫情控制 二分答案 倍增
傳送門 luogup1084 求最小值首先二分答案,記錄每個點倍增向上跳的資訊。設當前二分答案為mid midmi d 跳不到根節點的軍隊的位置是唯一確定的。對於跳的到的軍隊結點i ii取出其到根後仍能多走的距離res 1 mi d di s 1,i res1 mid dis 1,i res1 m ...
疫情控制(二分 貪心 倍增)
noip 2012 提高組 第二天 第三題 題目描述 h 國有 n 個城市,這 n 個城市用 n 1 條雙向道路相互連通構成一棵樹,1 號城市是首都,也是樹中的根節點。h 國的首都爆發了一種危害性極高的傳染病。當局為了控制疫情,不讓疫情擴散到邊境 城市 葉子節點所表示的城市 決定動用軍隊在一些城市建...
NOIP2012 疫情控制 貪心 二分 倍增
一道很全 du 面 liu 的題 題目大意 給定一棵樹,用最少的時間封住這棵樹。題解 首先可以很容易發現乙個條件 軍隊在走的時候都要盡量往上走,但不到根節點。因為越靠近根節點的點,控制的葉子節點越多。不過暴力是肯定會超時的,用倍增優化。題目求的是最長移動時間軍隊的最短時間,想到二分答案。但是還有這樣...