noip2016--D1--2
天天愛跑步
描述
小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