1139 First Contact

题意:给出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;
}

猜你喜欢

转载自www.cnblogs.com/kkmjy/p/9555962.html