由于计划生育的实行,我们以及将来几代人都会是独生子女,即每对夫妇只会有一个孩子。那么给你XXXX年某人的一张树形族谱,你能指出其中任意两人的关系吗?
Input
输入数据第一行一个整数T表示有T组数据。
每组数据第一行一个正整数N (2 < N < 10000 ,且N为奇数),表示族谱中有N个家族成员。
接下来N/2行,每行三个整数a b c,表示a的父亲是b,a的母亲是c。数据保证所给的是一棵树,家族成员的编号为1到N。
接下来一行一个正整数M (0 < M < 100),表示有M询问。
接下来M行,每行两个整数x y (x!=y),表示询问x y的关系。
Output
对于每一个询问,输出一行。
若x是y的祖辈,则输出:
0 S
若y是x的祖辈,则输出:
1 S
若都不是以上两种情况,则输出:
Relative
前两种情况中的S表示一个由大写字母F和M组成的字符串,F表示父亲,M表示母亲,表示前者是后者的XXX。例如:
0 FMM 表示x是y的父亲的母亲的母亲。
1 MFMF 表示y是x的母亲的父亲的母亲的父亲。
以此类推。
Sample Input
1 9 3 6 7 5 8 9 1 2 3 2 4 5 3 8 2 1 7 3 9
Sample Output
0 MF 1 MM Relative
/* 临接表 head:结点编号 E:边的编号 t[i].next:与结点u所有相连的点的边的编号 用path在dfs的时候记录下状态 */ #include<cstdio> #include<cstring> #include<algorithm> #include<vector> using namespace std; const int MAX = 10000 + 10; int head[MAX]; int path[MAX]; int E, ans; int G[MAX]; struct edge{ int v, w, next; }t[MAX]; void add(int u, int v, int w) { t[E].v = v; t[E].w = w; t[E].next = head[u]; head[u] = E++; } int dfs(int u, int fd, int step) { if(u == fd) { ans = step; for(int i = 0; i < step; i++) G[i] = path[i]; return true; } for(int i = head[u]; i != -1; i = t[i].next){ int v = t[i].v; path[step] = t[i].w; if(dfs(v, fd, step + 1)) return true; } return false; } int main() { int n, m, a, b, c; int T; scanf("%d", &T); while(T--){ memset(head, -1, sizeof(head)); memset(t, 0, sizeof(t)); scanf("%d", &n); E = 0; for(int i = 1; i <= n/2 ;i++){ scanf("%d%d%d", &a, &b, &c); add(a, b, 0); add(a, c, 1); } scanf("%d", &m); int x, y; for(int i = 1; i <= m ; i++){ scanf("%d%d", &x, &y); if(dfs(x, y, 0)) { printf("1 "); for(int j = 0 ; j < ans; j++){ printf("%c", G[j] ? 'M' : 'F'); } } else if(dfs(y, x, 0)){ printf("0 "); for(int j = 0 ; j < ans; j++){ printf("%c", G[j] ? 'M' : 'F'); } } else {printf("Relative"); } puts(""); } } return 0; }