PAT1139 First Contact (STL)

题意:当男孩 A 暗恋着女孩 B 的时候,他通常不会直接与她联系。取而代之的是,他可能会去找另一个男孩 C(他的好朋友)去拜托女孩 D(她是 B 和 C 的朋友)将女孩 B 约出来。这实在是麻烦不是吗?女孩也会做类似的事情。在给定的友谊关系网络中,请你帮助一些男孩和女孩列出所有可能会帮助他们进行第一次联系的朋友

注意: 可以是同性恋(即AB性别相同);不可以无中生友(即我就是我自己的朋友,A!=C,B!=D);不可以直接对朋友下手(即A!=D&&B!=C);需要按第一个朋友的编号从小到大进行排序,第一个朋友的编号相同时,按第二个朋友的编号从小到大进行排序。

思路:首先对编号进行离散化,这样一来就可以用邻接矩阵存储朋友关系。

根据性别丢到两个set里,这样就不用手动去重排序啦

对于每个询问,先判断A和B的性别,然后两重循环对应同性,找出里是朋友关系且满足上述条件的两个电灯泡,存下来再排序输出。

 

#include<bits/stdc++.h>
#define rep(i,a,n) for(int i=a;i<n;i++)
#define INF 0x3f3f3f3f
using namespace std;
const int N=300+233;
const int M=2e5+5;
int n,m,k;
set<int>boys,girls;
string num[N];
unordered_map<string,int> mp;
int id;
int g[N][N];
int main(){
    cin>>n>>m;
    while(m--){
        string a,b;
        cin>>a>>b;
        string x=a,y=b;
        if(a[0]=='-') x=x.substr(1);
        if(b[0]=='-') y=y.substr(1);
        if(mp.count(x)==0) mp[x]=++id,num[id]=x;
        if(mp.count(y)==0) mp[y]=++id,num[id]=y;
        
        int px=mp[x],py=mp[y];
        g[px][py]=g[py][px]=1;
        
        if(a[0]=='-') girls.insert(px);
        else boys.insert(px);
        if(b[0]=='-') girls.insert(py);
        else boys.insert(py);
    }

    int k;cin>>k;
    while(k--){
        string x,y;
        set<int>p=boys,q=boys;
        vector<pair<string,string>>res;
        
        cin>>x>>y;
        if(x[0]=='-') x=x.substr(1),p=girls;
        if(y[0]=='-') y=y.substr(1),q=girls;
        
        int a=mp[x],b=mp[y];
        for(auto c:p){
            for(auto d:q){
                if(c!=a&&c!=b&&d!=b&&d!=a&&g[a][c]&&g[c][d]&&g[d][b])
                    res.push_back({num[c],num[d]});
            }
        }
        
        cout<<res.size()<<endl;
        sort(res.begin(),res.end());
        for(auto ans:res) cout<<ans.first<<" "<<ans.second<<endl;
    }
      
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值