PAT a1139

目的:找出能帮两个人做第一次联系的朋友

输入:

N  (1,300] 总人数

M 关系对,边

M条关系对。每个人有4位数字代替。负数是女孩

K  <=100  查询数

K对男女,第一个人爱上了第二个人

输出:

对于每个查询,输出不同的朋友对数,可以帮助他们的朋友对数,然后在每一行输出朋友对ID。

如果A,B是相反的性别。先输出于A相同性别的A的朋友,在输出于B相同性别B的朋友。如果AB性别相同。输出和他们性别相同的朋友。

按照非减输出第一个id。然后非减少输出第二个id。

算法:

先把边按照男生女生分开存,由于id是四位正负都有的数字,所以存边不用矩阵,用链表。然后深度优先搜索。找到一条路径就比对是否满足条件,然后把它存进vector向量。开始用map存边。

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

using namespace std;

struct node{
    int b,c;

};

map<int,bool> h;
vector<int> frnd[10000];
int n,m,k;
bool cmp(node a,node d)
{
    if(a.b!=d.b)
    {
        return a.b<d.b;
    }else
    {
        return a.c<d.c;
    }
}
int main()
{
    scanf("%d%d",&n,&m);

    for(int i=0;i<m;i++)
    {

        string left,right;
        cin>>left>>right;
        if(left.size()==right.size())
        {
            frnd[abs(stoi(left))].push_back(abs(stoi(right)));
            frnd[abs(stoi(right))].push_back(abs(stoi(left)));
        }
        h[abs(stoi(right))*10000+abs(stoi(left))]= h[abs(stoi(left))*10000+abs(stoi(right))] = true;
    }

    scanf("%d",&k);
    for(int i=0;i<k;i++)
    {
        int a,d;
        cin>>a>>d;
        vector<node> ans;
        for(int j=0;j<frnd[abs(a)].size();j++)
        {
            for(int l=0;l<frnd[abs(d)].size();l++)
            {
                if(frnd[abs(a)][j]==abs(d)||frnd[abs(d)][l]==abs(a)) continue;
                if(h[frnd[abs(a)][j]*10000+frnd[abs(d)][l]]==true)
                {
                    ans.push_back(node{frnd[abs(a)][j],frnd[abs(d)][l]});
                }

            }
        }
        printf("%d\n",ans.size());
        sort(ans.begin(),ans.end(),cmp);
        for(int j=0;j<ans.size();j++)
        {
            printf("%04d %04d\n",ans[j].b,ans[j].c);

        }

    }
    return 0;
}

反思:在家休息了十天,智力水平倒退回3岁水平。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值