一些齿轮之间有正着连接和反着连接,问最后一个齿轮的方向。
dfs即可。写不写快速读入就是40ms和4ms的区别。。
还真是资格赛。
#include <stdio.h>
const int N = 1001, M = 2001;
int read() {
int s = 0, f = 1; char ch = getchar();
for (; ch < '0' || ch > '9'; ch = getchar()) if (ch == '-') f = -1;
for (; '0' <= ch && ch <= '9'; ch = getchar()) s = s * 10 + ch - '0';
return s * f;
}
int h[N], p[M], v[M], w[M], f[N], cnt = 0;
void add(int x, int y, int z) {
p[++cnt] = h[x]; v[cnt] = y; w[cnt] = z; h[x] = cnt;
}
void dfs(int x, int fa) {
for (int i = h[x]; i; i = p[i])
if (v[i] != fa) {
f[v[i]] = f[x] ^ w[i];
dfs(v[i], x);
}
}
int main() {
int i, x, y, z, n;
n = read();
for (i = 1; i < n; i++) {
x = read(); y = read(); z = read();
add(x, y, z); add(y, x, z);
}
dfs(1, 0);
printf("%d", f[n]);
return 0;
}
1603: [Usaco2008 Oct]打谷机
Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 758 Solved: 582
[ Submit][ Status][ Discuss]
Description
Farmer John有一个过时的打谷机(收割小麦),它需要带子来带动。发动机驱动轮1总是顺时针旋转的,用来带动转轮2,转轮2来带动转轮3,等等。一共有n(2<=n<=1000)个转轮(n-1条带子)。上面的图解描述了转轮的两种连接方式,第一种方式使得两个轮子旋转的方向相同,第二种则相反。 给出一串带子的信息: *Si—驱动轮 *Di—被动轮 *Ci—连接的类型(0=直接连接,1=交叉连接) 不幸的是,列出的信息是随即的。 作为样例,考虑上面的图解,n=4,转轮1是驱动轮,可以得知最后转轮4是逆时针旋转的。
Input
*第一行:一个数n *第二行到第n行:每一行有三个被空格隔开的数:Si,Di,Ci
Output
*第一行:一个单独的数,表示第n个转轮的方向,0表示顺时针,1表示逆时针。
Sample Input
4
2 3 0
3 4 1
1 2 0
2 3 0
3 4 1
1 2 0
Sample Output
1