搜尋的最廣泛應用優化——剪枝
這道題的dp和貪心都是無正確性的,所以,搜~~~~~~~
搜的時候你發現不剪枝極容易被卡掉(然而良心noip沒有這麼做,不剪枝仍然飛快),所以我們需要一些玄學的剪枝最常見的有倆:i.我們一層一層累加被感染人群若當前被感染人群已經大於已知解那麼就捨去。 ii.之後的每一層如果都取最大仍不如已知解優則捨去。
玄學.........
#include #include#include
#define maxn 310
namespace
pre inline
int max(int x,int
y)
intans;
}namespace
treec[maxn
<<1
];
inthead[maxn],t,size[maxn],f[maxn],deep_max,max[maxn];
bool
did[maxn];
std::vector
floor[maxn];
inline
int comp(int x,int
y) inline
void add(int x,int
y) inline
void dfs(int x,int fa,int
deep)
inline
void dfs(int deep,int
ans)
for(int i=0;i1].size();i++)
if(did[f[floor[deep+1
][i]]])
did[floor[deep+1][i]]=0
; }
}namespace
mid inline
void
work()
dfs(
1,0);
printf("%d
",n-pre::ans);
}}intmain()
noip 2003 傳染病控制
問題背景 近來,一種新的傳染病肆虐全球。蓬萊國也發現了零星感染者,為防止該病在蓬萊國大範圍流行,該國 決定不惜一切代價控制傳染病的蔓延。不幸的是,由於人們尚未完全認識這種傳染病,難以準確判別病毒攜帶者,更沒有研製出疫苗以保護易感人群。於是,蓬萊國 的疾病控制中心決定採取切斷傳播途徑的方法控制疾病傳播...
NOIP2003 傳染病控制
純搜尋題 一開始思路比較混亂,但是仔細想想便能得出正解。我們預處理出每一棵子樹的大小 每一層的兒子們,之後進行一次dfs,暴力列舉刪除每一棵子樹,同時更新答案,同時注意標記是否刪除。搜尋完成後回溯。最終就能得出答案。1 include 2 using namespace std 3int n,m,a...
NOIP 2003傳染病控制
思路 1.dfs一遍,求出每個點的size,fa,deep 2.按照deep將每個點存入vector中 3.按照deep進行dffs求解答案 dffs時切斷某個點與fa的連線表示該點打上標記,表示不被感染,並減去該點size,每次進入下一層時,掃fa,如果fa被標記,則該點也被標記。最後dffs結束...