2020.4.4普及C組 Clock Tree 【紀中】【枚舉】

此題枚舉
我們枚舉每一個房間,找與它相連的房間。
不停地在房間來回走,
直到除了枚舉的房間以外其餘房間都是1212
根(就是枚舉的第一個房間) 正好是1212或是11的時候就證明這條路是可以的,
那爲啥11可以呢?
因爲可以在根的最後一個孩子停下,不走回來。
這時候根和最後一個孩子的時間會差一個

AC CodeAC~Code

#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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章