PTA 1139 First Contact

翻译:

与现在不同,男孩和女孩在早年表达爱意的方式相当含蓄。当男孩A对女孩B有好感时,通常他不会直接联系她。相反,他可能会找他的好朋友之一男孩C,让他找一个同时是B和C的朋友女孩D,通过D向B传递信息 - 这是一个相当冒险的举动,不是吗?女孩们也会类似地做。

在这里,给出了一个友谊关系网络,你需要帮助一个男孩或一个女孩列出所有可能帮助他们建立第一次联系的朋友。

输入规格:
每个输入文件包含一个测试用例。对于每个用例,第一行给出两个正整数N(1 < N ≤ 300)和M,分别表示人的总数和友谊关系的数量。然后跟随M行,每行给出一对朋友。这里一个人用一个4位数的ID表示。为了区分他们的性别,我们用负号表示女孩。

在关系之后,给出一个正整数K(≤ 100),表示查询的数量。然后跟随K行的查询,每行给出一对恋人,用空格分隔。假设第一个人对第二个人有好感。

输出规格:
对于每个查询,首先在一行中打印出他们可以找到的不同朋友对的数量,然后在每行中打印出一对朋友的ID。

如果恋人A和B是不同性别的,你必须先打印出与A同性别的朋友,然后是与B同性别的朋友。如果他们是同性别的,那么两个朋友必须与他们的性别相同。保证每个人只有一个性别。

朋友必须按照第一个ID的非递减顺序打印,对于相同的第一个ID,按照第二个ID的递增顺序打印。

错误点:

1.输出格式未使用%04d

2.使用arr的下标作为键值查询(a*1000+b)是否为朋友关系,arr[]为bool类型

思路:一个邻接表v存储同性朋友关系,数组arr存储朋友关系。对应查询a,b,先找出a的同行好友c,b的同性好友d,在c!=b且d!=a的前提下,判断c和d是否是朋友关系,若是存入ans中。

#include<iostream>
#include<string.h>
#include<string>
#include<map>
#include<unordered_map>
#include<vector>
#include<algorithm>

using namespace std;
int n,m,k;

struct Node{
    int a,b;
};

unordered_map<int,bool> arr;//两者是否有朋友关系
vector<int> v[10001];//邻接表 t同行朋友关系
bool cmp(Node &x,Node &y){
    return x.a==y.a?x.b<y.b:x.a<y.a;
}

int main(){
    cin>>n>>m;//n个人,m行关系
    for(int i=0;i<m;i++){
        string a,b;
        cin>>a>>b;
        if(a.length()==b.length()){
            v[abs(stoi(a))].push_back(abs(stoi(b)));
            v[abs(stoi(b))].push_back(abs(stoi(a)));
        }
        arr[abs(stoi(a))*10000+abs(stoi(b))] = arr[abs(stoi(b))*10000+abs(stoi(a))] = true;
    }
    cin>>k;
    for(int i=0;i<k;i++){
        int a,b;
        cin>>a>>b;
        vector<Node> ans;
        for(int x=0;x<v[abs(a)].size();x++){
            for(int y=0;y<v[abs(b)].size();y++){
                if(abs(a)==v[abs(b)][y] || abs(b)==v[abs(a)][x] ) continue;
                if(arr[v[abs(a)][x]*10000 + v[abs(b)][y] ]){
                    ans.push_back(Node{v[abs(a)][x] , v[abs(b)][y]});
                }
            }
        }
        sort(ans.begin(),ans.end(),cmp);
        cout<<ans.size()<<endl;
        for(int i=0;i<ans.size();i++){
            // cout<<ans[i].a<<" "<<ans[i].b<<endl;
            printf("%04d %04d\n",ans[i].a,ans[i].b);
        }
    }
    
    return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值