游历魔法王国(牛客网 网易2018校招题 图论)
鏈接:https://www.nowcoder.com/questionTerminal/f58859adc39f4edc9cd8e40ba4160339
 來源:牛客網
 魔法王國一共有n個城市,編號為0~n-1號,n個城市之間的道路連接起來恰好構成一棵樹。
 小易現在在0號城市,每次行動小易會從當前所在的城市走到與其相鄰的一個城市,小易最多能行動L次。
 如果小易到達過某個城市就視為小易游歷過這個城市了,小易現在要制定好的旅游計劃使他能游歷最多的城市,請你幫他計算一下他最多能游歷過多少個城市(注意0號城市已經游歷了,游歷過的城市不重復計算)。
輸入描述:
輸入包括兩行,第一行包括兩個正整數n(2 ≤ n ≤ 50)和L(1 ≤ L ≤ 100),表示城市個數和小易能行動的次數。 第二行包括n-1個整數parent[i](0 ≤ parent[i] ≤ i), 對于每個合法的i(0 ≤ i ≤ n - 2),在(i+1)號城市和parent[i]間有一條道路連接。
 ?
輸出描述:
輸出一個整數,表示小易最多能游歷的城市數量。示例1
輸入
5 2 0 1 2 3輸出
3ps:
昨天測試了下網易的校招題,最后還剩半個小時的時候一共做出了5道題。。后面3題有些難沒啥思路就沒做了,交上去試試居然能排到百分之7,好吧以前搞acm還是有一點底子的(自豪233),今天打算把剩下3題補完,有兩題還比較有意思就寫一篇博客記錄下解題思路。。
思路:
這題一開始想用直接用dfs模擬來做,但是題目說明是可以回退的,這樣回退以后步數算起來就無從下手了,但是仔細分析以后其實這題不難,想要走過的城市最多,那么肯定是先往最長的也就是不用回退的那條路去走,這個時候就要分好幾種情況了,一種是題目給的步數小于最長的那條路的長度,那么直接輸出題目給的步數+1就是答案了(因為包括第0個節點),如果步數大于最長的那條路的長度,那么也要分情況,一種是可以走完所有節點,步數還有剩余的情況,那么肯定答案就是所有節點的個數了,如果可以走完最長的路但是不能走完所有節點,那么答案就應該是最長那條路的長度+1+(走完最長路剩余步數)/2了,因為如果要走最長路以外的路,一來一回,消耗是2倍,所以可以這么計算,至于最長路的求法,可以用dp,但是這題數據那么小我直接就dfs求了。
代碼:
#include<stdio.h> #include<string.h> #include<math.h> #include<algorithm> using namespace std; int maxx; int vis[55]; int nums[55]; int p[55][55]; void dfs(int index,int step) {if(step>maxx)maxx=step;int i;for(i=0;i<nums[index];i++){if(!vis[p[index][i]]){vis[p[index][i]]=1;dfs(p[index][i],step+1);vis[p[index][i]]=0;}} } int main() {memset(nums,0,sizeof(nums));memset(vis,0,sizeof(vis));int n,x;scanf("%d%d",&n,&x);maxx=1;for(int i=1;i<n;i++){int t;scanf("%d",&t);p[t][nums[t]]=i;p[i][nums[i]]=t;nums[t]++;nums[i]++;}vis[0]=1;dfs(0,0);if(maxx>=x)printf("%d\n",min(maxx+1,x+1));else{printf("%d\n",min(maxx+1+(x-maxx)/2,n));}return 0; }?
總結
以上是生活随笔為你收集整理的游历魔法王国(牛客网 网易2018校招题 图论)的全部內容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: 中国电信服务
- 下一篇: 唐诗宋词中的妙语之最
