PAT---A1139 First Contact (30分)

题意

A暗恋B,让朋友C传话给B的朋友D,D再传话给B。

  • A.gender == C.gender
  • B.gendre == D.gender
  • C是A的朋友,不能是B本身
  • D是B的朋友,不能是A本身

这样A暗恋B,需要两个朋友才能传话给B,找出所有对这样的朋友,从小到大输出。

思路

很明显遍历一下就能得出答案,注意到从小到大输出,map有排序功能,所以就用map,这样就省去了对结果进行排序的步骤。
有两点需要注意:

  1. 输入要用string 输入来判断性别,否则输入0无法判断性别。
  2. 并不要求A和B异性(我怎么变橘色了?)

Sample Input:

10 18
-2001 1001
-2002 -2001
1004 1001
-2004 -2001
-2003 1005
1005 -2001
1001 -2003
1002 1001
1002 -2004
-2004 1001
1003 -2002
-2003 1003
1004 -2002
-2001 -2003
1001 1003
1003 -2001
1002 -2001
-2002 -2003
5
1001 -2001
-2003 1001
1005 -2001
-2002 -2004
1111 -2003

Sample Output:

4
1002 2004
1003 2002
1003 2003
1004 2002
4
2001 1002
2001 1003
2002 1003
2002 1004
0
1
2003 2001
0
#include "bits/stdc++.h"
using namespace std;
int main(){
//     freopen("input.txt","r",stdin);
    int n, m; cin >> n >> m;
    map<int,map<int,int>> links;
    map<int,bool> gender;
    for (int i = 0; i < m; ++i) {
        string s1,s2; cin >> s1 >> s2;
        int a = atoi(s1.c_str()), b = atoi(s2.c_str());
        gender[abs(a)] = s1[0] != '-', gender[abs(b)] = s2[0] != '-'; // !
        links[abs(a)][abs(b)] = 1, links[abs(b)][abs(a)] = 1;
    }
    int k; scanf("%d",&k);
    for (int i = 0; i < k; ++i) {
        int a,b; scanf("%d%d",&a,&b);
        a = abs(a), b = abs(b);
        vector<pair<int,int>> ans;
        for(auto &item1:links[a]){
            int fa = item1.first;
            if (gender[a] != gender[fa] || fa == b) continue;
            for(auto &item2:links[fa]){
                int ffa = item2.first;
                if ( ffa == a || gender[ffa]!=gender[b] || !links[ffa].count(b)) continue;
                ans.emplace_back(fa,ffa);
            }
        }
        cout << ans.size() << endl;
        for(auto &item:ans) printf("%04d %04d\n",item.first,item.second);
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值