1139 First Contact (30 分)
解题思想
AC代码
#include <iostream>
#include <vector>
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <string>
using namespace std;
struct peo{
int id, sex;
};
struct ret{
int a, b;
};
bool cmp(ret a, ret b){
if (a.a != b.a) return a.a < b.a;
return a.b < b.b;
}
vector<peo> friends[10000];
int main(){
int n, m, id1, id2, k;
scanf("%d%d", &n, &m);
string tmpid1, tmpid2;
for (int i = 0; i < m; i++){
cin >> tmpid1 >> tmpid2;
id1 = stoi(tmpid1);
id2 = stoi(tmpid2);
if (tmpid1 == "-0000"){
friends[abs(id2)].push_back({0, 0});
friends[0].push_back({abs(id2), id2>0?1:0});
}
else if (tmpid2 == "-0000"){
friends[abs(id1)].push_back({0, 0});
friends[0].push_back({abs(id1), id1>0?1:0});
}
else {
friends[abs(id1)].push_back({abs(id2), id2>=0?1:0});
friends[abs(id2)].push_back({abs(id1), id1>=0?1:0});
}
}
scanf("%d", &k);
while (k--){
int id1sex, id2sex;
cin >> tmpid1 >> tmpid2;
id1 = stoi(tmpid1);
id2 = stoi(tmpid2);
if (tmpid1 == "-0000"){
id1sex = 0;
id2sex = id2>0?1:0;
}
else if (tmpid2 == "-0000"){
id2sex = 0;
id1sex = id1>0?1:0;
}
else {
id1sex = id1>=0?1:0;
id2sex = id2>=0?1:0;
}
int aid, bid, pos = 0;
bool flag = false;
struct ret rets[90010];
id1 = abs(id1);
id2 = abs(id2);
for (int i = 0; i < int(friends[id1].size()); i++){
if (friends[id1][i].sex == id1sex && friends[id1][i].id != id2){
aid = friends[id1][i].id;
for (int j = 0; j < int(friends[aid].size()); j++){
if (friends[aid][j].sex == id2sex
&& friends[aid][j].id != id1 && friends[aid][j].id != id2){
bid = friends[aid][j].id;
for (int t = 0; t < int(friends[bid].size()); t++){
if (friends[bid][t].id == id2){
flag = true;
rets[pos].a = aid;
rets[pos++].b = bid;
}
}
}
}
}
}
if (flag){
sort(rets, rets+pos, cmp);
printf("%d\n", pos);
for (int i = 0; i < pos; i++)
printf("%04d %04d\n", rets[i].a, rets[i].b);
}
else printf("0\n");
}
return 0;
}