思路:1.dfs一遍,求出每個點的size,fa,deep;
2.按照deep將每個點存入vector中;
3.按照deep進行dffs求解答案;
dffs時切斷某個點與fa的連線表示該點打上標記,表示不被感染,並減去該點size,每次進入下一層時,掃fa,如果fa被標記,則該點也被標記。
最後dffs結束的狀態為 搜到比最深deep更深的一層,或搜到某層時該層的點已全部被打上標記。
記錄dffs出的最小答案,輸出
完整ac **
#include#include
#include
using
namespace
std;
intn,m,ans;
struct
nodee[
805];
int head[305],cnt,fa[305],siz[305],deep[305],madep,in[305
];vector
k[305
];inline
void add(int
from,int
to);
head[
from]=cnt;
}void dfs(int x,int f,int
dep)
}void dffs(int dep,int
now)
for(int i=0;ii)
if(in
[fa[k[dep][i]]])
in[k[dep][i]]=1
;
else
in[k[dep][i]]=0
;
bool f=1
;
for(int i=0;ii)
if(!in[k[dep][i]])f=0
;
if(f)
for(int i=0;ii)
}int
main()
dfs(
1,0,1
);
for(int i=1;i<=n;++i)
k[deep[i]].push_back(i);
ans=n;
dffs(
2,n);
printf("%d
",ans);
return0;
}
noip 2003 傳染病控制
問題背景 近來,一種新的傳染病肆虐全球。蓬萊國也發現了零星感染者,為防止該病在蓬萊國大範圍流行,該國 決定不惜一切代價控制傳染病的蔓延。不幸的是,由於人們尚未完全認識這種傳染病,難以準確判別病毒攜帶者,更沒有研製出疫苗以保護易感人群。於是,蓬萊國 的疾病控制中心決定採取切斷傳播途徑的方法控制疾病傳播...
NOIP2003 傳染病控制
純搜尋題 一開始思路比較混亂,但是仔細想想便能得出正解。我們預處理出每一棵子樹的大小 每一層的兒子們,之後進行一次dfs,暴力列舉刪除每一棵子樹,同時更新答案,同時注意標記是否刪除。搜尋完成後回溯。最終就能得出答案。1 include 2 using namespace std 3int n,m,a...
noip2003傳染病控制 2008 11 5
noip2003傳染病控制 2008.11.5 小結 1.這道題,我的方法普遍的要快很多,以空間換時間,我先把他們的關係用不同的陣列存起來,包括每個人的前面,每個人的後面,都存了下來,算是對資料的初始化吧。包括每個人在第幾層,然後一層一層的直接呼叫。好的資料結構真的很重要,載運算前,對資料的處理,真...