题目原地址
题目意思
如果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;
}