樹形dp-CF-337D. Book of Evil

題目鏈接:

http://codeforces.com/problemset/problem/337/D

題目大意:

給一棵樹,m個點,一個距離d,求有多少個點A,使得A到所有的m個點距離都不超過d.

解題思路:

樹形dp.

有兩種方法可以解:

1、類似于樹的直徑的求法,先以任意一點作為樹根,找到距離該點最遠的m中的A點(A點一定是m個點中距離相距最遠的兩點的一個端點),然后以A點作為樹根,依次計算各點到A點的最短距離d1[],并找到距離最遠的m中的點B點,然后以B點為樹根,依次找到各點到B點的距離d2[]. ?最后再掃一遍,找到d1和d2都不超過d的點。這種方法求比較簡單。

2、先以m中任意一點為樹根,在子樹中,求出每個節點到達m中的點的最大距離max1,達到max1的直接兒子pre,次大距離。然后再從該根出發,遞歸維護一個值從父親過來并且不是通過該節點的最大距離。每次求兒子時判斷下,是不是等于該節點的pre,如果是的話,從次大中找。

樹很靈活,遞歸很強大。多做些樹上的題。

代碼:

?

#include<iostream>
#include<cmath>
#include<cstdio>
#include<cstdlib>
#include<string>
#include<cstring>
#include<algorithm>
#include<vector>
#include<map>
#include<set>
#include<stack>
#include<list>
#include<queue>
#define eps 1e-6
#define INF 0x1f1f1f1f
#define PI acos(-1.0)
#define ll __int64
#define lson l,m,(rt<<1)
#define rson m+1,r,(rt<<1)|1
#pragma comment(linker, "/STACK:1024000000,1024000000")
using namespace std;//freopen("data.in","r",stdin);
//freopen("data.out","w",stdout);
#define Maxn 110000
//
struct Node
{int max1,max2,pre; //只用保存在子樹中,該點到給定點的最大距離、次大距離以及最大距離的直接兒子編號//向下推進的時候,維護一個從父親到達該點的最大值
}node[Maxn];struct Edge
{int v;struct Edge *next;
}*head[Maxn<<1],edge[Maxn<<1]; //無向邊
bool pm[Maxn];
int n,m,d,ans,cnt;void add(int a,int b)
{++cnt;edge[cnt].v=b;edge[cnt].next=head[a],head[a]=&edge[cnt];
}
void dfs1(int pre,int cur)
{if(pm[cur]) //如果是給定的點 距離為0,否則置為無窮大node[cur].max1=node[cur].max2=0;elsenode[cur].max1=node[cur].max2=-INF;struct Edge * p=head[cur];while(p){if(p->v!=pre){dfs1(cur,p->v);//先求出兒子if(node[p->v].max1+1>=node[cur].max1) //用兒子來更新最大值{node[cur].max2=node[cur].max1;//更新次大值node[cur].max1=node[p->v].max1+1;node[cur].pre=p->v;}else{  //更新次大值if(node[p->v].max1+1>node[cur].max2)node[cur].max2=node[p->v].max1+1;}}p=p->next;}
}
void dfs2(int pre,int cur,int pa) //往下遞歸的時候,順便判斷,決定出來
{if(max(node[cur].max1,pa)<=d) //從父親和孩子的最大距離不超過d的話,肯定是可以的ans++;struct Edge * p=head[cur];while(p){if(p->v!=pre){if(p->v==node[cur].pre) //如果最大值是從該兒子更新過來的,從次大值中選dfs2(cur,p->v,max(node[cur].max2,pa)+1);elsedfs2(cur,p->v,max(node[cur].max1,pa)+1);}p=p->next;}
}int main()
{int a,b,aa;while(~scanf("%d%d%d",&n,&m,&d)){memset(pm,false,sizeof(pm));memset(head,NULL,sizeof(head));for(int i=1;i<=m;i++){scanf("%d",&a);pm[a]=true; //標記能夠攻擊的點}for(int i=1;i<n;i++){scanf("%d%d",&aa,&b);add(aa,b);add(b,aa);}ans=0;if(pm[1]) //如果是給定的m中點,從父親過來的為0{dfs1(-1,1);dfs2(-1,1,0);}else //如果不是給定的m中的點,從父親過來的為-INF{dfs1(-1,1);dfs2(-1,1,-INF);}// dfs1(-1,a);/* for(int i=1;i<=n;i++)printf("i:%d %d pre:%d\n",i,node[i].max1,node[i].pre);*/// dfs2(-1,a,0); //最后一個參數表示從父親過來的最大距離,//注意不能從任意一點開始,因為從該點的父親過來的不為0,為-INF.printf("%d\n",ans);}return 0;
}
/*
10 1 0
3
10 1
1 3
8 3
3 5
5 7
5 4
2 4
9 4
6 4
*/


?


?


?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/280840.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/280840.shtml
英文地址,請注明出處:http://en.pswp.cn/news/280840.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

運行時獲取類庫信息

運行時獲取類庫信息Intro在我們向別的開源項目提 issue 的時候&#xff0c;可能經常會遇到別人會讓我們提供使用的版本信息&#xff0c;如果別的開源項目類庫集成了 source link&#xff0c;我們可以從程序集信息中獲取到版本以及對應的 commit 信息&#xff0c;這樣我們就可以…

Oracle數據表中輸入引號等特殊字符

Oracle輸入特殊字符的特殊方法: UPDATE BOOKMARK SET BM_VALUEq/ --在這里寫下需要輸入的內容&#xff08;可以包括引號、回車等特殊的符號&#xff09;,所見即所得 / -- WHERE BM_NAMEXX

xbox360鏈接pc_如何將實時電視從Xbox One流式傳輸到Windows PC,iPhone或Android Phone

xbox360鏈接pcSet up your Xbox One’s TV integration and you can do more than just watch TV on your Xbox: you can also stream that live TV from your Xbox to a Windows 10 PC, Windows phone, iPhone, iPad, or Android device over your home network. 設置Xbox One…

PS2019工具介紹筆記(一)

通用快捷鍵 ALT鼠標滾輪放大縮小 空格按左鍵 移動圖片 一、新建 PPI 顯示器72PPI 印刷(國際通用分辨率)300PPI 海報高清寫真96-200PPI 大型噴繪25-50PPI 顏色模式 RGB(紅綠藍) CMYK(青洋紅黃黑)印刷業 二、移動工具 ctrlT 圖形自由變換 alt…

WPF ABP框架更新日志(最新2022-11月份)

更新說明本次更新內容包含了WPF客戶端以及Xamarin.Forms移動端項目, 更新內容總結如下:WPF 客戶端修復啟動屏幕無法跳轉異常修復添加好友異常修復托盤圖標狀態更新異常優化好友發送消息時狀態檢測更新聊天窗口UI風格更新好友列表得頭像顯示更新聊天窗口消息日期分組顯示更新系統…

JSONObject和JSONArray 以及Mybatis傳入Map類型參數

import org.json.JSONArray;import org.json.JSONObject;將字符串轉化為JSONArray JSONArray jsonArray new JSONArray(deviceInfo); //注意字符串的格式將JSONArray轉化為JSONObject類型 JSONObject jsonObject jsonArray.getJSONObject(0);將值存入Map Map<String,S…

十月cms_微軟十月更新失敗使整個PC行業陷入困境

十月cmsMicrosoft still hasn’t re-released Windows 10’s October 2018 Update. Now, PC manufacturers are shipping PCs with unsupported software, and Battlefield V is coming out next week with real-time ray-tracing technology that won’t work on NVIDIA’s RT…

ab 測試工具

ab&#xff0c;即Apache Benchmark&#xff0c;在Apache的安裝目錄中找到它。安裝目錄/bin/ab.exe。ab -n 數字 -c 數字 url路徑我們對位于本地Apache服務器上、URL為localhost/index.php的頁面進行壓力測試。測試總次數為1000&#xff0c;并發數為100(相當于100個用戶同時訪問…

bat批處理筆記(二)

eof 是“end of file”的縮寫 在批處理作用主要有二&#xff1a; 1、在無call的情況下&#xff0c;會直接退出批處理&#xff0c;此時等同于exit 2、在call的情況下&#xff0c;會中止call&#xff0c;繼續執行其他命令 echo off call :str1 pause goto :eof echo //此行代…

讓Visual Studio 2013為你自動生成XML反序列化的類

Visual Sutdio 2013增加了許多新功能&#xff0c;其中很多都直接提高了對代碼編輯的便利性。如&#xff1a; 1. 在代碼編輯界面的右側滾動條上顯示不同顏色的標簽&#xff0c;讓開發人員可以對所編輯文檔的修改、查找、定位情況一目了然。而不用像往常一樣上下不停地拖動滾動條…

20年的 .NET ,更需要 00 后的你

.NET 20 周年&#xff0c; 在國內有一大批和 .NET 一起成長的開發者&#xff0c;有一大批在不同行業采用 .NET 作為解決方案的企業。或者你會經常聽到很多的大神說他的 .NET 經歷&#xff0c;也會聽到 .NET “牛逼” 的故事&#xff0c;更會聽到用 .NET 不用“996”的神話。但對…

UIT創新科存儲系統服務“500強”汽車名企

信息化已成為汽車產業鏈各企業提高市場競爭力和傳統汽車產業謀求轉型升級的推動力&#xff0c;無論是汽車生產商&#xff0c;還是汽車服務商和零配件生產商&#xff0c;無不重視信息化系統的建設。某全球汽車行業著名的零配件生產商&#xff0c;財富500強企業之一&#xff0c;從…

通過從備份中排除這些文件夾來節省Time Machine驅動器上的空間

Are you getting notifications about a full Time Machine drive? Do you feel like your backups are taking too long? A bigger, faster hard drive might be the best solution, but you can also help by excluding particular folders from your backups. 您是否收到有…

c#調用觸滑輸入法實現觸摸屏鍵盤功能

背景最近在做一個項目&#xff0c;用戶端是觸摸屏&#xff0c;涉及到一些表單數據的操作&#xff0c;因為是沒有外接的鼠標鍵盤&#xff0c;所以想著當用戶在操作表單的時候&#xff0c;能夠把軟件鍵盤輸入法給調出來使用。什么是觸滑輸入法觸滑輸入法Swype&#xff0c;是針對觸…

Teradata天睿公司推出適用各種部署環境的全球最強分析數據庫

Teradata天睿公司&#xff08;Teradata Corporation&#xff0c;紐交所&#xff1a;TDC&#xff09;推出Teradata Everywhere?&#xff0c;成為業內首家在多種公有云、托管云和本地部署環境下部署全球最強海量并行處理&#xff08;MPP&#xff09;分析數據庫的廠商。這些部署環…

[轉載]C/C++框架和庫

C/C框架和庫 裝載自:http://blog.csdn.net/xiaoxiaoyeyaya/article/details/42541419值得學習的C語言開源項目 Webbench Webbench是一個在linux下使用的非常簡單的網站壓測工具。它使用fork()模擬多個客戶端同時訪問我們設定的URL&#xff0c;測試網站在壓力下工作的性能&#…

如何使用智能鈴聲避免在Android中令人尷尬的大聲鈴聲

Choosing a ringtone volume can be hard – there is no one setting that is right for all environments. What works perfectly at home may be too quiet for when you’re on the train, but too loud for the office. Intelligent Ringer can be used to adjust ringto…

為什么要把類設置成密封?

前幾天筆者提交了關于FasterKvCache的性能優化代碼&#xff0c;其中有一個點就是我把一些后續不需要繼承的類設置為了sealed密封類&#xff0c;然后就有小伙伴在問&#xff0c;為啥這個地方需要設置成sealed&#xff1f;提交的代碼如下所示&#xff1a;一般業務開發的同學可能接…

powershell 常用命令筆記

常用集合&#xff0c;方便后續復制粘貼 # 判斷文件在不在 # 輸出文件 IF(!(test-path $filePath)) {$result|Out-File $filePath }# 讀取txt $result(Get-Content $filePath -TotalCount 1).Trim() $result# 刪除文件 remove-item "C:\wistron\Datasource\spiderPort.txt…

Linux 性能監控 : CPU 、Memory 、 IO 、Network

一、CPU 1.良好狀態指標 CPU利用率&#xff1a;User Time < 70%&#xff0c;System Time < 35%&#xff0c;User Time System Time < 70% 上下文切換&#xff1a;與CPU利用率相關聯&#xff0c;如果CPU利用率狀態良好&#xff0c;大量的上下文切換也是可以接受的 可…