题意:给出n个人,m对朋友关系,其中带负号的表示女孩。然后给出k对查询a,b,要求找出所有a的同性别好友c,以及b的同性别好友d,且c和d又是好友关系。输出所有满足条件的c和d,按c的升序输出,若c编号相同则按d的升序输出。
思路:其实不难,30分的题有点被唬住了。
对于每一个查询a,b,先分别找出a同性好友friend[a],b的同性好友friend[b],然后在friend[a]和friend[b]中找出具有朋友关系的c,d即可。注意,根据题意,-0000和0000是不一样的,若以int类型数据读入,则均表示为0,从而无法区别性别,因此读入数据应该以字符串的类型读入。两者性别是否一致可通过其字符串的长度是否一致来区别。最后,若a,b为同性时,存在a的好友就是b,或b的好友就是a的特殊情况,应该排除掉。因为a要向b联系必须通过两个中间人!
代码:
#include <cstdio> #include <cstring> #include <cstdlib> #include <vector> #include <unordered_map> #include <algorithm> using namespace std;
//因为输入的id有正负之分,故不用int Friend[N]的形式 unordered_map<int,vector<int>> Friend;//Friend[i]存放i的同性别朋友 unordered_map<int,unordered_map<int,bool>> beFriend;//这种用法第一次用,可以借鉴 struct Pair{ int a,b; Pair(){} Pair(int a_,int b_):a(a_),b(b_){} }; bool cmp(Pair p1,Pair p2){ if(p1.a!=p2.a) return p1.a<p2.a; else return p1.b<p2.b; } int main() { int n,m,k; scanf("%d%d",&n,&m); char s1[10],s2[10]; while(m--){ scanf("%s%s",s1,s2); int a=atoi(s1),b=atoi(s2); beFriend[a][b]=beFriend[b][a]=true; if(strlen(s1)==strlen(s2)){//s1,s2同性别 Friend[a].push_back(b); Friend[b].push_back(a); } } scanf("%d",&k); int u,v; while(k--){ scanf("%d%d",&u,&v); vector<Pair> vec; for(int i=0;i<Friend[u].size();i++){ for(int j=0;j<Friend[v].size();j++){ int fu=Friend[u][i],fv=Friend[v][j]; if(fu==v || fv==u) continue; if(beFriend[fu][fv]) vec.push_back(Pair(abs(fu),abs(fv)));//注意加绝对值 } } printf("%d\n",vec.size()); sort(vec.begin(),vec.end(),cmp); for(auto it:vec) printf("%04d %04d\n",it.a,it.b); } return 0; }
第一遍做的,比较烦!
#include <iostream> #include <vector> #include <map> #include <set> using namespace std; struct Friend{ set<string> maleFriend,femaleFriend; }; map<string,Friend> mp; struct Pair{ string a,b; Pair(){} Pair(string u,string v){ a=(u[0]=='-' ? u.substr(1,4) : u); b=(v[0]=='-' ? v.substr(1,4) : v); } }; int main() { //ifstream cin("pat.txt"); int n,m,q; cin>>n>>m; string a,b; while(m--){ cin>>a>>b; if(a[0]=='-'){//a为女性 if(b[0]=='-') mp[a].femaleFriend.insert(b); else mp[a].maleFriend.insert(b); mp[b].femaleFriend.insert(a); }else{ if(b[0]=='-') mp[a].femaleFriend.insert(b); else mp[a].maleFriend.insert(b); mp[b].maleFriend.insert(a); } } cin>>q; while(q--){ cin>>a>>b; bool sameGender=(a.size()==b.size()?true:false); vector<Pair> ans; set<string> friend_a,friend_b;//分别存放a,b对应的同性别好友 friend_a=(a[0]=='-' ? mp[a].femaleFriend : mp[a].maleFriend); friend_b=(b[0]=='-' ? mp[b].femaleFriend : mp[b].maleFriend); for(auto fa:friend_a){ set<string> friend_fa; if(sameGender){ if(fa==b) continue; friend_fa=(a[0]=='-' ? mp[fa].femaleFriend : mp[fa].maleFriend); for(auto fb:friend_fa) if(fb!=a && friend_b.find(fb)!=friend_b.end()) ans.push_back(Pair(fa,fb)); }else{ friend_fa=(a[0]=='-' ? mp[fa].maleFriend : mp[fa].femaleFriend); for(auto fb:friend_fa) if(friend_b.find(fb)!=friend_b.end()) ans.push_back(Pair(fa,fb)); } } cout<<ans.size()<<'\n'; for(auto it:ans) cout<<it.a<<' '<<it.b<<'\n'; } return 0; }