1. 程式人生 > 其它 >C. Kefa and Park

C. Kefa and Park

題意: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; }