C. Kefa and Park
阿新 • • 發佈:2021-08-12
題意:Kefa想去餐廳,要穿過公園。公園由一棵樹組成,有n個節點,葉子節點上是餐廳,每節點上可能有貓,Kefa害怕貓,當有連續m只貓出現時,就不能繼續往下走了。我們需要找出Kefa能去多少家餐廳。
題解:dfs深搜,設定跳出條件:連續貓得數量超過m;或者已經走到了葉子節點(度為0的節點)。搜尋所在點連線的各個點。
accode:
vector<int>G[100010];//用來存圖 int iscat[100010];//儲存是否該點有貓 int isleaf[100010];//用於判斷是否是葉子節點 int vis[100010];//判斷該點是否走過 int n, m,ans=0;
void dfs(int sta, int cat)
{
if (iscat[sta])cat++;//記錄連續的貓
else cat = 0;
if (cat > m)return;//如果不滿足條件就跳出
if (isleaf[sta] < 2 && sta != 1)
{
ans++;
return;
}//滿足條件記錄答案
if (vis[sta] == 0)// 遍歷
{
vis[sta] = 1;
for (int i = 0; i < G[sta].size(); i++)
dfs(G[sta][i], cat);
vis[sta] = 0;
}
}
int main() { cin >> n >> m;for (int i = 1; i <= n; i++) cin >> iscat[i]; for (int i = 1; i <= n - 1; i++) { int x, y; cin >> x >> y; G[x].push_back(y); G[y].push_back(x); isleaf[x]++; isleaf[y]++;//無向圖,雙方標記 } dfs(1, 0); cout << ans;return 0; }