PAT 1139 First Contact

题目原地址
题目意思
如果A喜欢B,即使A与B是朋友,A也不会直接向B表白。首先A找到与自己性别相同的一堆朋友{C},然后找到C的一堆与B性别相同的朋友{D},如果{C}和{D}是朋友关系,那么A通过{C}、{D}向B表白。如果不够清楚请看下图
这里写图片描述
题目难点
1.男性输入前面带有‘-’号,怎么处理,我的处理思路是把‘-’变成1,即男性是1开头的5位数
2.C中不能含有B,D中不能有A
3.输出是注意不要丢了前导0
解题思路
1.找到与A相同性别的朋友C,找到后按升序排序
2.找到与B相同性别的朋友D,找到后安升序排序
3.找到C中每一个人的与B性别相同的所有朋友Ci,找到后按升序排序
4.判断Ci与D中是否有相同的Dj,如有,那么Ci、Dj是备选答案
题目代码

#include <iostream>
#include <vector>
#include <algorithm>
#include <stdio.h>
#include <math.h>
#include <string>
#include <sstream>
/* run this program using the console pauser or add your own getch, system("pause") or input loop */
using namespace std;
const int MAX = 20005;
vector< vector<int> > graph(MAX);
//字符串转为数字 
int transfer(string s){
    stringstream ss;
    ss << s;
    int num;
    ss >> num;
    return num;
}
int main(int argc, char *argv[]) {
    int N,M;
    cin>>N>>M;
    //输入友谊图 
    for(int i=0;i<M;i++){
        //strs和stre是为了判断区别+0000和-0000 
        string strs,stre;
        cin>>strs>>stre;
        int s,e; 
        s = transfer(strs);
        e = transfer(stre);
        if(strs.at(0)=='-'){
            s = 10001+abs(s);
        }
        if(stre.at(0)=='-'){
            e = 10001+abs(e);
        } 
        graph[s].push_back(e);
        graph[e].push_back(s);
    }
    int K;
    cin>>K;
    for(int i=0;i<K;i++){
        int s,e,ss,ee;
        //strs和stre是为了判断区别+0000和-0000
        string strs,stre;
        bool is=false,ie=false;
        cin>>strs>>stre;
        s = transfer(strs);
        e = transfer(stre);
        if(strs.at(0)=='-'){//男的 
            s = 10001+abs(s);
            ss = abs(s); 
            is = true;
        }
        if(stre.at(0)=='-'){
            e = 10001+abs(e);
            ee = abs(e);
            ie = true;
        }
        vector<int> fs;
        if(is){//男的,只能找男的朋友 
            for(int j=0;j<graph[s].size();j++){
                if(graph[s][j]>=10001 && graph[s][j]!=e){
                    fs.push_back(graph[s][j]-10001);
                }
            } 
        }else if(!is){//女的,只能找女的朋友 
            for(int j=0;j<graph[s].size();j++){
                if(graph[s][j]<10000 && graph[s][j]!=e){
                    fs.push_back(graph[s][j]);
                }
            } 
        }
        vector<int> fe; 
        if(ie){//男的,只能找男的朋友 
            for(int j=0;j<graph[e].size();j++){
                if(graph[e][j]>=10001 && graph[e][j]!=s){
                    fe.push_back(graph[e][j]-10001);
                }
            } 
        }else if(!ie){//女的,只能找女的朋友 
            for(int j=0;j<graph[e].size();j++){
                if(graph[e][j]<10000 && graph[e][j]!=s){
                    fe.push_back(graph[e][j]);
                }
            } 
        }
        //s 和 e的符合性别的朋友都找好了,接下来开始凑对
        //s中的一个fs[j]与fe中是否是朋友关系,是的话,存下来
        sort(fs.begin(),fs.end());
        sort(fe.begin(),fe.end()); 
        int sum = 0;
        vector<int> ans1;
        vector<int> ans2;
        for(int j=0;j<fs.size();j++){
            int t = fs[j];
            int tt = t;
            vector<int> ft;
            if(is){
                t += 10001;
            }
            if(ie){//男的,找男朋友 
                for(int k = 0;k<graph[t].size();k++){
                    if(graph[t][k]>=10001){
                        ft.push_back(graph[t][k]-10001);
                    }
                }   
            }else{
                for(int k = 0;k<graph[t].size();k++){
                    if(graph[t][k]<10000){
                        ft.push_back(graph[t][k]);
                    }
                }
            }
            sort(ft.begin(),ft.end());
            for(int k=0;k<ft.size();k++){
                for(int k2=0;k2<fe.size();k2++){
                    if(ft[k]==fe[k2]){
                        sum++;
                        ans1.push_back(tt);
                        ans2.push_back(fe[k2]);
                    }
                }
            } 
        }
        //输出答案 
        cout<<sum<<endl;
        for(int j=0;j<ans1.size();j++){
            printf("%04d %04d\n",ans1[j],ans2[j]);
        }
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/zhanggirlzhangboy/article/details/80215625