bzoj1603[Usaco2008 Oct]打谷机*
题意:
给个树,每个边都有边权0和1。0表示两个端点同色,1表示两个端点不同色。点1为黑色,问点n哪种颜色(颜色只有两种:黑和白)。树大小≤1000。
题解:
dfs一发。
代码:
1 #include <cstdio> 2 #include <cstring> 3 #include <algorithm> 4 #include <queue> 5 #define inc(i,j,k) for(int i=j;i<=k;i++) 6 #define maxn 1010 7 using namespace std; 8 9 inline int read(){ 10 char ch=getchar(); int f=1,x=0; 11 while(ch<'0'||ch>'9'){if(ch=='-')f=-1; ch=getchar();} 12 while(ch>='0'&&ch<='9')x=x*10+ch-'0',ch=getchar(); 13 return f*x; 14 } 15 int g[maxn][maxn],n,ans[maxn]; 16 void dfs(int x,int fa){ 17 inc(i,1,n)if(i!=fa&&g[x][i]!=-1)ans[i]=ans[x]^g[x][i],dfs(i,x); 18 } 19 int main(){ 20 n=read(); memset(g,-1,sizeof(g)); inc(i,1,n-1){int x=read(),y=read(),z=read(); g[x][y]=g[y][x]=z;} 21 dfs(1,0); printf("%d",ans[n]); return 0; 22 }
20160917