某一天,yellowstar在人生的道路上迷失了方向,迷迷糊糊之中,它誤入了一座迷宮中,幸運的是它在路口處發現了一張迷宮的地圖。
經過它的觀察,它發現這個迷宮一共有n個房間,並且這n個房間呈現乙個有根樹結構,它現在所在的1號房間為根,其它每個房間都有乙個上級房間,連線第i個房間和它的上級房間pi的道路長度為wi。
在地圖的背面,記載了這個迷宮中,每個房間擁有乙個時空傳送門,第i個房間的傳送門可以花費di單位的時間傳送到它的任意乙個下級房間中(如果x是y的下級房間,並且y是z的下級房間,那麼x也是z的下級房間)。
yellowstar的步行速度為1單位時間走1長度,它現在想知道從1號房間出發,到每乙個房間的最少時間。
input
包含多組測試資料。
第一行輸入n表示n個房間。
第二行輸出n個數字,第i個數字di表示i號房間傳送器需要花費的時間。
接下來n-1行,第i行包含兩個數字pi和wi,表示i+1號房間的上級房間為pi,道路長度為wi。
1≤n≤100000
1≤di, wi≤10^9
output
輸出n個數,第i個數表示從1號房間出發到i號房間的最少時間。 (注意,輸出最後乙個數字後面也要加乙個空格)
sample input
5 99 97 50 123 550
1 999
1 10
3 100
3 44
sample output
0 99 10 60 54
hint
初始在1號房間,到1號房間的代價為0。
通過1號房間的傳送門傳送到2號房間,到2號房間的代價為99。
通過1號房間走到3號房間,到3號房間的代價為10。
通過1號房間走到3號房間,在通過3號房間的傳送門傳送到4號房間,到4號房間的代價為60。
通過1號房間走到3號房間,在通過3號房間走到5號房間,到5號房間的代價為54。
分析:在乙個樹的根節點,求到達樹上每個節點的最小花費。對於乙個傳送門可以到達其節點子樹上的任意乙個幾點。首先可以明確,我們從根部走到某個節點的過程,要麼是全程走過去的。要麼是走一段,然後通過傳送門直接到達,或者根本不走,直接通過傳送門到達。
根本不存在先傳送門,然後走一會兒到達的情況,也就是說不可能有兩種方式交替的情況行走。因為如果我能通過傳送門到達的節點,為什麼還要中途停下來去走路?明明可以直達的位置,還要轉換方式再去徒增一段行走的花費。
這樣就轉換成了乙個問題。對於乙個節點,要麼從根節點直接走過來,這種情況直接求和即可得到。要麼從到達該節點路徑上的某乙個父節點直達。也就是用路徑上所有父節點的傳送門花費,鬆弛走到該點的最小花費。
對於當前結點,找其路徑上的父親鬆弛花費,對於子節點,深搜下去,用已經達到最優了的當前結點直接通過走的方式到達下乙個結點。而下乙個結點可能也可能通過路徑上的某乙個父節點直接傳送過來。
即使是這樣對於題目中提到的1e5個節點的資料量,仍然可能會出現單鏈樹的情況,這樣一來就成了o(n^2)的演算法,並且,因為路徑上的傳送門花費是小於1e9的,因此到達任意乙個節點,最大花費都不會超過1e9,因為一旦通過走的花費之後超過了1e9,其路徑上必有某個節點的傳送花費小於行走花費。因此都可以通過最大1e9的傳送到達。
#include
#include
#include
#include
#define ll long long
using
namespace
std;
const
int maxn=1e5+10;
struct edge
edge(int a,int b)
};int n,path[maxn],num;
int di[maxn],dist[maxn];
vector
mp[maxn];
void dfs(int now)
dist[1]=0;
num=0;
dfs(1);
for(int i=1; i<=n; i++) printf("%d ",dist[i]);
printf("\n");
}}
FZU 2285 迷宮尋寶
problem 2285 迷宮尋寶 洪尼瑪今天準備去尋寶,在乙個n n n行,n列 的迷宮中,存在著乙個入口 一些牆壁以及乙個寶藏。由於迷宮是四連通的,即在迷宮中的乙個位置,只能走到與它直接相鄰的其他四個位置 上 下 左 右 現洪尼瑪在迷宮的入口處,問他最少需要走幾步才能拿到寶藏?若永遠無法拿到寶藏...
2256 Huffuman樹(不考慮節點權值)
時間限制 1 sec 記憶體限制 512 mb 提交 91 解決 68 提交 狀態 討論版 命題人 外部匯入 huffman樹在編碼中有著廣泛的應用。在這裡,我們只關心huffman樹的構造過程。給出一列數 用這列數構造huffman樹的過程如下 1.找到中最小的兩個數,設為pa和pb,將pa和pb...
FZU 2176 經典線段樹
problem 2176 easy problem accept 38 submit 119 time limit 2000 msec memory limit 32768 kb problem description 給定一棵n個節點以1為根的樹,初始每個節點的值為0,現在我們要在樹上進行一些操作...