PAT_甲级_1139 First Contact

ByteLancerX
• 阅读 1117

题目大意:

一张人际关系网络图,然后给出一对情侣A和B(负数代表女生,正数代表男生),要求找到A的朋友(不是B,和A性别相同)C,B的朋友(不是A,和B的性别相同)D,如果C和D是朋友那么输出C和D的编号(输出的编号均为正数),并且按照C的非递减排列,如果相同,则按照D的升序排列。

算法思路:

对于每个人的编号保存其符号进行输入,使用string类型变量接收, 这样,判断性别是否相同直接判断两个字符串长度是否一样就行,并且为了简化搜索,我们用邻接表Adj只保存每一个人的同性朋友,然后再使用邻接矩阵保存所有的朋友关系,其行为男生,列为女生,这样就可以将女生转化为正数来进行保存,又由于题目的特殊性,从A到B的路径一定得是一个长度为4的路径,那么就直接遍历每一个A的同性朋友和B的同性朋友,判断这两人是否是朋友就好。如果是就说明找到了C和D,并将其添加进result中,在遍历结束后,对result按照规则排序输出即可.

注意点:

  • 1、此题没有必要使用DFS,第一个原因是男生编号为0000,女生编号为-0000的情况不是很好处理,第二是最后一个测试点会运行超时。
  • 2、这里使用邻接表只保存同性朋友可以大大降低时间复杂度。
  • 3、对于A的朋友不能是B,对于B的朋友不能是A,这里是针对A和B是同性朋友的特殊处理,防止路径长度为2.

提交结果:

PAT_甲级_1139 First Contact

AC代码:

#include<cstdio>
#include<vector>
#include<cstring>
#include<algorithm>
#include<string>
#include<cmath>
#include<iostream>

using namespace std;

struct Pair{
    int first,second;
    Pair(int f,int s){
        first = f;
        second = s;
    }
};

vector<int> Adj[10000];// 邻接表 ,保存每一个人的同性朋友 
int G[10000][10000];// 邻接矩阵,用来判断任意2人是否是朋友 

bool cmp(const Pair &a,const Pair &b){
    return a.first!=b.first?a.first<b.first:a.second<b.second;
}

int main(){
    int N,M;
    scanf("%d %d",&N,&M);
    string a,b;
    for(int i=0;i<M;++i){
        cin>>a>>b;
        int A = abs(stoi(a));
        int B = abs(stoi(b));
        if(a.size()==b.size()){
            // a和b是同性朋友 
            Adj[A].push_back(B);
            Adj[B].push_back(A);
        }
        G[A][B] = G[B][A] = 1;
    }
    int K;
    scanf("%d",&K);
    for(int i=0;i<K;++i){
        vector<Pair> result;
        cin>>a>>b;
        int A = abs(stoi(a));
        int B = abs(stoi(b));
        // 遍历A的同性朋友 
        for(auto &friendA:Adj[A]){
            // 遍历B的同性朋友 
            if(friendA==B) continue;// 其朋友不能是B,不然长度不能到达4 
            for(auto &friendB:Adj[B]){
                if(friendB==A) continue;// 其朋友不能是A,不然长度不能到达4
                if(G[friendA][friendB]==1){
                    // 找到C和D
                    result.emplace_back(friendA,friendB);
                }
            }
        }
        if(result.empty()){
            printf("0\n");
        }else {
            printf("%lu\n",result.size());
            sort(result.begin(),result.end(),cmp);
            for(auto &item:result){
                printf("%04d %04d\n",item.first,item.second);
            }
        }
    }
    return 0;
}
点赞
收藏
评论区
推荐文章
Wesley13 Wesley13
3年前
java多线程顺序执行并顺序输出ABC问题
1.有A、B、C、D四个线程,A线程输出A,B线程输出B,C线程输出C,D线程输出D,要求,同时启动四个线程,按顺序输出ABCD;本题主要通过join方法来实现顺序输出ABCD。代码如下:packagethread;/@authorBeauxie/publ
Easter79 Easter79
3年前
springboot的起步依赖
!(https://oscimg.oschina.net/oscnet/f3acbe4cf3b00c68207e091c172d6b45a27.png)加载自动配置的方式2:!(https://oscimg.oschina.net/oscnet/40341228c10f7a56d82323a1d622521d92d.png) spring
Wesley13 Wesley13
3年前
2019 力扣杯
给出长度相同的两个字符串:A 和 B,其中A\i\和B\i\是一组等价字符。举个例子,如果 A"abc" 且 B"cde",那么就有 'a''c','b''d','c''e'。等价字符遵循任何等价关系的一般规则:自反性:'a''a'对称性:'a'
Stella981 Stella981
3年前
Linux环境下分析和排查系统故障
!(https://oscimg.oschina.net/oscnet/53d8eee42feb4e1e803b810b615f1c31.gif)!(https://oscimg.oschina.net/oscnet/7beddfd577ac4683a145c6ab2b5f7090.jpg)1分析日志文件日
Stella981 Stella981
3年前
KVM调整cpu和内存
一.修改kvm虚拟机的配置1、virsheditcentos7找到“memory”和“vcpu”标签,将<namecentos7</name<uuid2220a6d1a36a4fbb8523e078b3dfe795</uuid
Wesley13 Wesley13
3年前
HTTP面试题(二):HTTP请求报文和响应报文格式
!(https://oscimg.oschina.net/oscnet/0406894fb1274bee91fc53c84c516576.jpg)看都看了还不点个赞!(https://oscimg.oschina.net/oscnet/095d444dc9a449ee85afd19b00fdf52b.png)!(h
Stella981 Stella981
3年前
Spring Boot日志集成
!(https://oscimg.oschina.net/oscnet/1bde8e8d00e848be8b84e9d1d44c9e5c.jpg)SpringBoot日志框架SpringBoot支持JavaUtilLogging,Log4j2,Lockback作为日志框架,如果你使用star
Stella981 Stella981
3年前
OpenJDK11与Spring Cloud Finchley的不兼容问题与解决
本文的环境:OpenJDK11.0.4,SpringCloudfinchleySR4,SpringBoot2.0.3最近遇到了一个问题,在feign调用的时候,时常会出现这样一个奇怪的错误:2019100708:00:00.620ERRORxxx,e1ba4c7540954aa3,871b99c4576d42e3
Stella981 Stella981
3年前
IntelliJ IDEA生成 Serializable 序列化 UID 的快捷键
首先创建一个类如Movie,让该类实现Serializable序列化接口。!(https://oscimg.oschina.net/oscnet/d53e24d7cfee9f6b230986b2792c2cee0ea.png)然后我们需要依次按照以下的方法找到Settings!(https://oscimg.oschina.net/os
Stella981 Stella981
3年前
Nginx反向代理upstream模块介绍
!(https://oscimg.oschina.net/oscnet/1e67c46e359a4d6c8f36b590a372961f.gif)!(https://oscimg.oschina.net/oscnet/819eda5e7de54c23b54b04cfc00d3206.jpg)1.Nginx反