PAT 甲级 1139 First Contact (30 分)

题目

题目跳转 1139 First Contact (30 分)
在这里插入图片描述

分析

这个题目有不少的细节,大意是两个人相爱的人通过自己的同性朋友来发送爱意,两个中间者必须也是朋友,然后输出这两个中间人的id。

  1. 需要对同性朋友的判断,这里又因为ID可能是+0000或者-0000读取的话可能都是0判断不出来,可以用他们的长度来比较下相同就算是同性。
  2. 结果的两个中间人需要按照主动示爱的人的性别放在前面,这里可能两个都是男的或者女的…那就别管了把前者的朋友放前面就好了。
  3. 之前想着用"id:id"作为string存储关系,结果因为转成string再比较超时了,直接用二维数组存储就好,反正内存都是够用。
  4. 在两位新人AB的朋友关系比较时,如果他们本来就是朋友,需要排除他们自己。
  5. 使用 %04d输出结果

code

#include <stdio.h>
#include <iostream>
#include <map>
#include <vector>
#include <algorithm>
using namespace std;
const int M = 310;
int relations[9999][9999];
struct User
{
   int code;
   vector<int> firends;
};
struct Rela
{
    int f,s;
};
map<int,User> users;
bool cmp(Rela r1, Rela r2){
    if(r1.f!=r2.f) return r1.f<r2.f;
    return r1.s<r2.s;
}
vector<Rela> sendMsg(int from,int to){
    vector<int> ff = users[from].firends;
    vector<int> tf = users[to].firends;
    vector<Rela> res;
    Rela *rela = new Rela;
    for (int i = 0; i < ff.size(); i++)
    {
        for (int j = 0; j < tf.size(); j++)
        {
            // 同号并相等
            if(relations[abs(ff[i])][abs(tf[j])] == 1){
                // 不能直接的送信 排除直接朋友的可能
                if(ff[i]!=to&&tf[j]!=from){
                    rela->f = abs(ff[i]);
                    rela->s = abs(tf[j]);
                    res.push_back(*rela);
                }
            }
        }
    }
    return res;
}

int main(){
    int n,m;
    cin>>n>>m;
    for (int i = 0; i < m; i++)
    {
        string u1,u2;
        cin>>u1>>u2;
        int intu1 = stoi(u1), intu2 = stoi(u2);
        relations[abs(intu1)][abs(intu2)] = 1;
        relations[abs(intu2)][abs(intu1)] = 1;
        // 判断是否同性 长度相同即为同性 异性直接不添加 因为此处只需要每人 A和B 找一次朋友
        if(u1.length() == u2.length()){
            users[intu1].code = intu1;
            users[intu2].code = intu2;
            users[intu1].firends.push_back(intu2);
            users[intu2].firends.push_back(intu1);
        }
    }
    int checknum;
    cin>>checknum;
    for (int i = 0; i < checknum; i++){
        int from,to;
        cin>>from>>to;
        vector<Rela> ans = sendMsg(from,to);
        if(ans.size()==0){
            cout<<0<<endl;
        }else{
            cout<<ans.size()<<endl;
            sort(ans.begin(),ans.end(),cmp);
            for (int j = 0; j < ans.size(); j++)
            {
               printf("%04d %04d\n",ans[j].f,ans[j].s);
            }
        }
    } 
}

结果

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值