bfs( L2-016 愿天下有情人都是失散多年的兄妹 (25 分))
這一題巨坑!!!
原題鏈接
L2-016 愿天下有情人都是失散多年的兄妹 (25 分)
呵呵。大家都知道五服以內不得通婚,即兩個人最近的共同祖先如果在五代以內(即本人、父母、祖父母、曾祖父母、高祖父母)則不可通婚。本題就請你幫助一對有情人判斷一下,他們究竟是否可以成婚?
輸入格式:
輸入第一行給出一個正整數N(2 ≤ N ≤10^4),隨后N行,每行按以下格式給出一個人的信息:
本人ID 性別 父親ID 母親ID
其中ID是5位數字,每人不同;性別M代表男性、F代表女性。如果某人的父親或母親已經不可考,則相應的ID位置上標記為-1。
接下來給出一個正整數K,隨后K行,每行給出一對有情人的ID,其間以空格分隔。
注意:題目保證兩個人是同輩,每人只有一個性別,并且血緣關系網中沒有亂倫或隔輩成婚的情況。
輸出格式:
對每一對有情人,判斷他們的關系是否可以通婚:如果兩人是同性,輸出Never Mind;如果是異性并且關系出了五服,輸出Yes;如果異性關系未出五服,輸出No。
這一題巨坑,剛開始一直有3個測試點沒過,很絕望,思路改了又改,一直沒有通過。
后來,發現每次輸入的時候都需要把父親和母親的性別更新一下(這個也是考驗我們需要把數據收集完整的意識),因為,當一個人的父親或者母親的信息沒有在下面的數據給出,那么這個人的父親和母親的性別就會沒有被保存,如果測試數據中要求你回答這個人父親或者他的母親是否可以和別人成為情侶時,就會無法判斷這兩個人是否是同性還是異性,那么就會有錯。
所以,最終我加了兩行代碼
情況就解決了。
、
反思一下自己,也不可以怪pat的測試數據苛刻,其實問題的根源是自己采集數據的過程中 不注意數據的完整性,在以后的工作和學習中,也要學會避免類似的問題發生。
完整代碼如下
#include<bits/stdc++.h> using namespace std; struct node{char gender;int f_m_id[2] = {-1,-1}; }cp[100000]; int book[100000]={0}; int flag = 0; int bfs(int id,int time){if(time == 5 ||id == -1 || flag == 1) return 0;book[id] = 1;for(int i = 0 ; i <= 1 ; i++){int f_id = cp[id].f_m_id[i];if(f_id == -1) continue;if(book[f_id] == 0){bfs(f_id,time + 1);}else{flag = 1;return 0;}}if(flag == 1)return 0;return 1; } int main(){int n,id,cnt,ch1,ch2;scanf("%d", &n);for(int i = 1; i <= n; i++){scanf("%d", &id);scanf("%s %d %d", &cp[id].gender, &cp[id].f_m_id[0], &cp[id].f_m_id[1]);cp[cp[id].f_m_id[0]].gender = 'M';cp[cp[id].f_m_id[1]].gender = 'F';}scanf("%d", &cnt);while(cnt--){scanf("%d %d", &ch1 ,&ch2);memset(book, 0, sizeof(book));flag = 0;if(cp[ch1].gender == cp[ch2].gender) printf("Never Mind\n");else if(bfs(ch1,0) && bfs(ch2,0)) printf("Yes\n");else printf("No\n");}return 0; }總結
以上是生活随笔為你收集整理的bfs( L2-016 愿天下有情人都是失散多年的兄妹 (25 分))的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ORA-00313 ORA-00312
- 下一篇: 随心--------------总结一