1. 程式人生 > >noip2016--D1--2

noip2016--D1--2

string 最短路徑 結點 表示 () lib 地圖 ont 函數

天天愛跑步

描述

小c同學認為跑步非常有趣,於是決定制作一款叫做《天天愛跑步》的遊戲。?天天愛跑步?是一個養成類遊戲,需要玩家每天按時上線,完成打卡任務。

這個遊戲的地圖可以看作一一棵包含 技術分享個結點和 技術分享條邊的樹, 每條邊連接兩個結點,且任意兩個結點存在一條路徑互相可達。樹上結點編號為從技術分享技術分享的連續正整數。

現在有技術分享個玩家,第技術分享個玩家的起點為 技術分享,終點為 技術分享 。每天打卡任務開始時,所有玩家在第技術分享秒同時從自己的起點出發, 以每秒跑一條邊的速度, 不間斷地沿著最短路徑向著自己的終點跑去, 跑到終點後該玩家就算完成了打卡任務。 (由於地圖是一棵樹, 所以每個人的路徑是唯一的)

小C想知道遊戲的活躍度, 所以在每個結點上都放置了一個觀察員。 在結點技術分享

的觀察員會選擇在第技術分享秒觀察玩家, 一個玩家能被這個觀察員觀察到當且僅當該玩家在第技術分享秒也理到達了結點 技術分享 。 小C想知道每個觀察員會觀察到多少人?

註意: 我們認為一個玩家到達自己的終點後該玩家就會結束遊戲, 他不能等待一 段時間後再被觀察員觀察到。 即對於把結點技術分享作為終點的玩家: 若他在第技術分享秒重到達終點,則在結點技術分享的觀察員不能觀察到該玩家;若他正好在第技術分享秒到達終點,則在結點技術分享的觀察員可以觀察到這個玩家。

輸入格式

輸入格式:

第一行有兩個整數技術分享技術分享 。其中技術分享代表樹的結點數量, 同時也是觀察員的數量, 技術分享代表玩家的數量。

接下來 技術分享行每行兩個整數技術分享技術分享,表示結點 技術分享到結點 技術分享有一條邊。

接下來一行 技術分享個整數,其中第技術分享個整數為技術分享

, 表示結點技術分享出現觀察員的時間。

接下來 技術分享行,每行兩個整數技術分享,和技術分享,表示一個玩家的起點和終點。

對於所有的數據,保證技術分享

輸出格式

輸出1行 技術分享個整數,第技術分享個整數表示結點技術分享的觀察員可以觀察到多少人。

備註

輸入輸出樣例

輸入樣例#1:
6 3
2 3
1 2 
1 4 
4 5 
4 6 
0 2 5 1 2 3 
1 5 
1 3 
2 6 
輸出樣例#1:
2 0 0 1 1 1 
輸入樣例#2:
5 3 
1 2 
2 3 
2 4 
1 5 
0 1 0 3 0 
3 1 
1 4
5 5 
輸出樣例#2:
1 2 1 0 1 

【樣例1說明】

對於1號點,技術分享,故只有起點為1號點的玩家才會被觀察到,所以玩家1和玩家2被觀察到,共有2人被觀察到。

對於2號點,沒有玩家在第2秒時在此結點,共0人被觀察到。

對於3號點,沒有玩家在第5秒時在此結點,共0人被觀察到。

對於4號點,玩家1被觀察到,共1人被觀察到。

對於5號點,玩家1被觀察到,共1人被觀察到。

對於6號點,玩家3被觀察到,共1人被觀察到。

【子任務】

每個測試點的數據規模及特點如下表所示。 提示: 數據範圍的個位上的數字可以幫助判斷是哪一種數據類型。

技術分享

目前只做了20分左右的做法,即暴力搜索。

從這種做法中得到的啟示:

1.如果想要返回上一步:void裏用return;其他的用return xxx( , );

2.如果想要強制退出void,可以設置一個全局變量(本題是br,即break的縮寫);當滿足退出條件時,br=true,然後把 if(br) return; 放在函數的最上面,這樣就會一層一層的退出了。

3.t++和t+1的區別:前者會改變t本身的值,後者只是在進一步的遞歸中使用新的t,而當前這步的t並不會因此改變

技術分享
 1 #include <iostream>
 2 #include <cmath>
 3 #include <cstring>
 4 #include <cstdio>
 5 #include <cstdlib>
 6 #include <algorithm>
 7 using namespace std;
 8 int n,m;
 9 bool map[10101][10101],vis[101010],br;
10 int a[101010];
11 int ans[101010];
12 void dfs(int st,int ed,int t)
13 {
14      if(br) return ;  //全局變量br可以強制退出函數 
15      if(vis[st]) return ; //返回上一步 
16      //cout<<st<<" "<<t<<endl;
17      vis[st]=1;
18      if(st==ed)
19      {
20          //if(a[ed]==t) ans[ed]++;
21          br=true;
22      }
23      if(a[st]==t) ans[st]++;
24      for(int i=1;i<=n;i++)
25      {
26          if(map[st][i] && !vis[i])
27          {
28              dfs(i,ed,t+1);  //如果是++t,那麽在退回的時候t就會比正常情況大1;而t+1沒有改變當前的t 
29          }
30      }
31 }
32 
33 int main()
34 {
35     scanf("%d%d",&n,&m);
36     for(int i=1;i<n;i++)
37     {
38         int u,v;
39         scanf("%d%d",&u,&v);
40         map[u][v]=1;
41         map[v][u]=1;
42     }
43     for(int i=1;i<=n;i++) scanf("%d",&a[i]);
44     for(int i=1;i<=m;i++)
45     {
46         memset(vis,0,sizeof(vis));
47         br=0;
48         int st,ed;
49         scanf("%d%d",&st,&ed);
50         dfs(st,ed,0);
51         
52     }
53     for(int j=1;j<=n;j++) printf("%d ",ans[j]);
54     return 0;
55 }
2016--D1--2 1.0

noip2016--D1--2