1. 程式人生 > >FZU 2256 迷宮

FZU 2256 迷宮

col () oid 註意 pre https 如何 back 其他

https://vjudge.net/problem/FZU-2256

題意:略

思路:

在比賽的時候想到了一次dfs,一次bfs但是樣例都過不了。。。賽後才知道,距離的更新必須同步,不能先把時光機的距離更新了,再去更新走路的距離。

這題實際上是樹上的動態規劃,但是可以用一次dfs解決。每次更新的距離的時候,有兩個距離需要註意一下,第一個是通過時光機的距離,第二個是實際的距離。時光機的距離如何更新呢,通過上級的距離與(實際的距離加上當前的時光機的距離)進行比較更新。實際的距離的更新就是直接加上當前的實際距離加上走的距離傳入下一級就ok了。註意一開始傳入的時光機的距離設置為無窮大,因為沒有其他時光機可以到達1號房間。

代碼:

 1 #include <stdio.h>
 2 #include <string.h>
 3 #include <vector>
 4 #include <algorithm>
 5 using namespace std;
 6 
 7 struct edge
 8 {
 9     int from,to,dist;
10 };
11 
12 vector<edge> edges;
13 
14 vector<int> v[100005];
15 
16 int d[100005];
17 int dis[100005];
18 
19
void init(void) 20 { 21 edges.clear(); 22 memset(v,0,sizeof(v)); 23 } 24 25 void adde(int from,int to,int dist) 26 { 27 edge t; 28 t.from = from,t.to = to,t.dist = dist; 29 30 edges.push_back(t); 31 32 int sz = edges.size(); 33 34 v[from].push_back(sz-1); 35 } 36 37 void
dfs(int rt,int cst1,int cst2)//cst1是傳送,cst2是走路 38 { 39 dis[rt] = min(cst1,cst2); 40 41 for (int i = 0;i < v[rt].size();i++) 42 { 43 int id = v[rt][i]; 44 45 edge t = edges[id]; 46 47 int x = t.to,w = t.dist; 48 49 int cost = min(dis[rt] + d[rt],cst1); 50 51 dfs(x,cost,dis[rt] + w); 52 } 53 } 54 55 int main() 56 { 57 int n; 58 59 while (scanf("%d",&n) != EOF) 60 { 61 init(); 62 63 for (int i = 1;i <= n;i++) 64 { 65 scanf("%d",&d[i]); 66 } 67 68 for (int i = 1;i < n;i++) 69 { 70 int id,dis; 71 72 scanf("%d%d",&id,&dis); 73 74 adde(id,i+1,dis); 75 } 76 77 dfs(1,99999999,0); 78 79 for (int i = 1;i <= n;i++) 80 printf("%d ",dis[i]); 81 82 printf("\n"); 83 } 84 85 return 0; 86 }

FZU 2256 迷宮