此題枚舉
我們枚舉每一個房間,找與它相連的房間。
不停地在房間來回走,
直到除了枚舉的房間以外其餘房間都是。
當根(就是枚舉的第一個房間) 正好是或是的時候就證明這條路是可以的,
那爲啥可以呢?
因爲可以在根的最後一個孩子停下,不走回來。
這時候根和最後一個孩子的時間會差一個。
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
using namespace std;
int n,x,y,ans,a[10010],t[10010];
int head[10010],tot;
struct node
{
int x,y,next;
}e[10010];
void ljb(int x,int y)
{
e[++tot].x=x;
e[tot].y=y;
e[tot].next=head[x];
head[x]=tot;
}
void dfs(int x,int y)
{
for(int i=head[x]; i; i=e[i].next)
{
if(e[i].y==y) //防止死循環
continue;
dfs(e[i].y,x);
t[x]=(t[x]-t[e[i].y]+12)%12; //鐘錶+1(因爲我們是這樣枚舉的,所以12就是0)
}
}
int main()
{
freopen("clocktree.in","r",stdin);
freopen("clocktree.out","w",stdout);
cin>>n;
for(int i=1; i<=n; i++)
scanf("%d",&a[i]),a[i]%=12;
for(int i=1; i<=n-1; i++)
{
scanf("%d%d",&x,&y);
ljb(x,y);
ljb(y,x);
}
for(int i=1; i<=n; i++)
{
memcpy(t,a,sizeof(t));
dfs(i,0);
if(t[i]==0||t[i]==1) //判斷是否可以(這裏0就是12)
ans++;
}
cout<<ans;
return 0;
}