日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

PTA:7-106 愿天下有情人都是失散多年的兄妹 (25分)(bfs,dfs)

發布時間:2024/1/18 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 PTA:7-106 愿天下有情人都是失散多年的兄妹 (25分)(bfs,dfs) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

7-106 愿天下有情人都是失散多年的兄妹 (25分)

呵呵。大家都知道五服以內不得通婚,即兩個人最近的共同祖先如果在五代以內(即本人、父母、祖父母、曾祖父母、高祖父母)則不可通婚。本題就請你幫助一對有情人判斷一下,他們究竟是否可以成婚?

輸入格式:
輸入第一行給出一個正整數N(2 ≤ N ≤10000),隨后N行,每行按以下格式給出一個人的信息:
本人ID 性別 父親ID 母親ID
其中ID是5位數字,每人不同;性別M代表男性、F代表女性。如果某人的父親或母親已經不可考,則相應的ID位置上標記為-1。

接下來給出一個正整數K,隨后K行,每行給出一對有情人的ID,其間以空格分隔。

注意:題目保證兩個人是同輩,每人只有一個性別,并且血緣關系網中沒有亂倫或隔輩成婚的情況。

輸出格式:
對每一對有情人,判斷他們的關系是否可以通婚:如果兩人是同性,輸出Never Mind;如果是異性并且關系出了五服,輸出Yes;如果異性關系未出五服,輸出No。

輸入樣例:
24
00001 M 01111 -1
00002 F 02222 03333
00003 M 02222 03333
00004 F 04444 03333
00005 M 04444 05555
00006 F 04444 05555
00007 F 06666 07777
00008 M 06666 07777
00009 M 00001 00002
00010 M 00003 00006
00011 F 00005 00007
00012 F 00008 08888
00013 F 00009 00011
00014 M 00010 09999
00015 M 00010 09999
00016 M 10000 00012
00017 F -1 00012
00018 F 11000 00013
00019 F 11100 00018
00020 F 00015 11110
00021 M 11100 00020
00022 M 00016 -1
00023 M 10012 00017
00024 M 00022 10013
9
00021 00024
00019 00024
00011 00012
00022 00018
00001 00004
00013 00016
00017 00015
00019 00021
00010 00011

輸出樣例:
Never Mind
Yes
Never Mind
No
Yes
No
Yes
No
No

剛開始我首先想到的bfs進行搜索,構成一個樹,本人相當于根節點,向下就行搜索其父母,對出現的進行標記即可:
bsf AC代碼:(注意代碼中標記的坑)

#include <bits/stdc++.h> using namespace std; vector<int> p[100000]; char sex[100000];int main(){int n,k,a,c,d,x,y;char b;cin >> n; for(int i=0; i<n; i++){cin>>a>>b>>c>>d;p[a].push_back(c);p[a].push_back(d);sex[a]=b;if(c!=-1) sex[c]='M'; //坑點,父母的性別要加上,不然判斷不了父母之間的結婚情況; if(d!=-1) sex[d]='F';}cin>>k;while(k--){cin>>x>>y;if(sex[x]==sex[y]) cout<<"Never Mind"<<endl;else{int depth=0,flag=0,d[100000]={},vis[100000]={};queue<int> f,m; f.push(x);d[x]=1;while(!f.empty()){int ff=f.front();if(d[ff]==5) break;vis[ff]=1;f.pop();for(int i=0; i<p[ff].size(); i++){if(p[ff][i]!=-1){vis[p[ff][i]]=1;f.push(p[ff][i]); d[p[ff][i]] = d[ff]+1;} }}memset(d,0,sizeof(d));m.push(y);d[y]=1;while(!m.empty()){int mm=m.front();if(d[mm]==5) break;m.pop();flag=0;for(int i=0; i<p[mm].size(); i++){if(p[mm][i]!=-1&&vis[p[mm][i]]) flag++;else if(p[mm][i]!=-1) m.push(p[mm][i]);}if(flag>0){cout<<"No"<<endl;break;}} if(!flag) cout<<"Yes"<<endl;} }return 0; }

通過后,感覺自己寫的代碼不是很好,上網搜了一下,發現用dfs的方法也很方便,下面給出dfs AC代碼:

#include <bits/stdc++.h> using namespace std;vector<int> vec[100000];//存關系圖 bool vis[100000];//標記五服以內的親屬 char sex[100000];//記錄性別 bool flag;//標記情侶是否為近親 void Dfs(int x,int num)//num表示第幾代,從0開始 {if(num>=4) return; //超過五代直接退出 for(int i=0;i<vec[x].size();i++){if(!vis[vec[x][i]]){vis[vec[x][i]]=1;//標記出現的人 Dfs(vec[x][i],num+1); }else flag=1;//五服之內出現一樣的人 } } int main() {int T;cin>>T;while(T--){int t,fa,ma;char ch;cin>>t>>ch>>fa>>ma;sex[t]=ch;if(fa!=-1){ //-1不用保存,避免數據處理不當導致數組越界 vec[t].push_back(fa);//保存雙親 sex[fa]='M';//記錄父親性別 }if(ma!=-1){vec[t].push_back(ma);sex[ma]='F';}}cin>>T;while(T--){int x,y;cin>>x>>y; if(sex[x]==sex[y]) cout<<"Never Mind"<<endl; //同性 else{memset(vis,0,sizeof(vis)); vis[x]=1; vis[y]=1;flag=0;Dfs(x,0);Dfs(y,0);if(flag)//被標記過說明這兩人為近親 cout<<"No"<<endl;elsecout<<"Yes"<<endl;}}return 0; }

貼出dfs參考博客:https://blog.csdn.net/sm20170867238/article/details/82118718
歡迎大家進行批評改正!!!

總結

以上是生活随笔為你收集整理的PTA:7-106 愿天下有情人都是失散多年的兄妹 (25分)(bfs,dfs)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。