PAT(A) 1139 First Contact (30 point(s)) 测试点

  1. 测试点2:输入存在“-0000”
  2. 测试点3、4、5:AB ≠ CD
#include<bits/stdc++.h>
using namespace std;

int N, M, K;
string v1, v2;
vector<int> gender;
vector<vector<int>> v;
map<string, int> m1; // m1: id->index
map<int, string> m2; // m2: index->id

void findPath(vector<vector<int>> &path){
    int a = m1[v1], b = m1[v2], c, d;
    for(int i = 0; i < v[a].size(); i++){
        c = v[a][i];
        if(c == b) continue;
        if(gender[a] == gender[c]){
            for(int k = 0; k < v[c].size(); k++){
                d = v[c][k];
                if(d == a) continue;
                if(gender[b] == gender[d] && find(v[d].begin(), v[d].end(), b) != v[d].end())
                    path.push_back({c, d});
            }
        }
    }
}

bool cmp(vector<int> a, vector<int> b){
    if(a[0] == b[0]) return m2[a[1]] < m2[b[1]];
    return m2[a[0]] < m2[b[0]];
}

int main(void){
    scanf("%d %d", &N, &M);
    
    v.resize(N); gender.resize(N);
    int n = 0;
    for(int i = 0; i < M; i++){
        cin >> v1 >> v2;
        int tag1 = 1, tag2 = 1;
        if(v1.size() == 5) tag1 = 0, v1 = v1.substr(1, 4);
        if(v2.size() == 5) tag2 = 0, v2 = v2.substr(1, 4);
        if(m1.find(v1) == m1.end()) m1[v1] = n, m2[n] = v1, n++;
        if(m1.find(v2) == m1.end()) m1[v2] = n, m2[n] = v2, n++;
        v[m1[v1]].push_back(m1[v2]); v[m1[v2]].push_back(m1[v1]);
        gender[m1[v1]] = tag1; gender[m1[v2]] = tag2;
    }
    
    scanf("%d", &K);
    for(int i = 0; i < K; i++){
        cin >> v1 >> v2;
        if(v1.size() == 5) v1 = v1.substr(1, 4);
        if(v2.size() == 5) v2 = v2.substr(1, 4);
        if(m1.find(v1) == m1.end() || m1.find(v2) == m1.end())
            printf("0\n");
        else{
            vector<vector<int>> path;
            findPath(path);
            sort(path.begin(), path.end(), cmp);
            printf("%d\n", path.size());
            for(int j = 0; j < path.size(); j++)
                printf("%s %s\n", m2[path[j][0]].c_str(), m2[path[j][1]].c_str());
        }
    }
    
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值