哪位大神来帮忙看看错了啦。不胜感激
//方法一,集合
#include<iostream>
#include<unordered_map>
#include<unordered_set>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<vector>
using namespace std;
#define MAX 310
typedef struct node{
int a,b;
node(int x,int y):a(x),b(y){}
}node;
string id[MAX];
vector<node>out;
unordered_map<int,int>num;
unordered_set<int>dge[MAX],sge[MAX];
bool cmp(node &a,node &b)
{
if(a.a==b.a)return a.b<b.b;
else return a.a<b.a;
}
int main()
{
freopen("test.txt","r",stdin);
int N,M,K,cnt=0,f1,f2;
string s1,s2;
scanf("%d %d",&N,&M);
while(M--){
cin>>s1>>s2;
f1=abs(stoi(s1));f2=abs(stoi(s2));
if(!num.count(f1)){num[f1]=cnt++;id[cnt-1]=s1;}
if(!num.count(f2)){num[f2]=cnt++;id[cnt-1]=s2;}
if(s1.length()==s2.length()){
sge[num[f1]].insert(f2);
sge[num[f2]].insert(f1);
}else{
dge[num[f1]].insert(f2);
dge[num[f2]].insert(f1);
}
}
scanf("%d",&K);
while(K--){
out.clear();
cin>>s1>>s2;
f1=abs(stoi(s1));f2=abs(stoi(s2));
unordered_set<int>::iterator i,j;
for(i=sge[num[f1]].begin();s1==id[num[f1]]&&i!=sge[num[f1]].end();++i){
for(j=sge[num[f2]].begin();s2==id[num[f2]]&&j!=sge[num[f2]].end();++j){
if(s1.length()==s2.length()){
if(*(i)!=*(j)&&sge[num[*(j)]].count(*(i)))out.push_back(node(*(i),*(j)));
}else{
if(*(i)!=*(j)&&dge[num[*(j)]].count(*(i)))out.push_back(node(*(i),*(j)));
}
}
}
sort(out.begin(),out.end(),cmp);
printf("%d\n",out.size());
for(unsigned k=0;k<out.size();++k)printf("%d %d\n",out[k].a,out[k].b);
}
return 0;
}
//方法二,搜索图
#include<iostream>
#include<algorithm>
#include<unordered_map>
#include<vector>
#include<cmath>
#include<cstring>
using namespace std;
#define MAX 310
unordered_map<int,int>num;
bool gra[MAX][MAX]={0};
vector<int>man,woman;
vector<pair<int,int> >out;
//查询时性别不同,但id相同
void findCD(bool ga,int a,bool gb,int b)//
{
int i,j,x,y;
out.clear();
if(ga){//本来是女,但是查询输入一个男的相同id
for(i=0;i<man.size();++i){
x=man[i];
if(gra[num[a]][num[x]]){
if(!gb){ //男女
for(j=0;j<woman.size();++j){
y=woman[j];
if(gra[num[x]][num[y]]&&gra[num[y]][num[b]]){
out.push_back(make_pair(x,y));
}
}
}else{ //男男
for(j=0;j<man.size();++j){
y=man[j];
if(j!=i&&gra[num[x]][num[y]]&&gra[num[y]][num[b]]){
out.push_back(make_pair(x,y));
}
}
}
}
}
}else{//a为女
for(i=0;i<woman.size();++i){
x=woman[i];
if(gra[num[a]][num[x]]){
if(!gb){//女女
for(j=0;j<woman.size();++j){
y=woman[j];
if(j!=i&&gra[num[x]][num[y]]&&gra[num[y]][num[b]]){
out.push_back(make_pair(x,y));
}
}
}else{//女男
for(j=0;j<man.size();++j){
y=man[j];
if(gra[num[x]][num[y]]&&gra[num[y]][num[b]]){
out.push_back(make_pair(x,y));
}
}
}
}
}
}
printf("%d\n",out.size());
for(i=0;i<out.size();++i)printf("%04d %04d\n",out[i].first,out[i].second);
}
int main()
{
freopen("test.txt","r",stdin);
int N,M,K,f1,f2,cnt=0;
string s1,s2;
scanf("%d %d",&N,&M);
while(M--){
cin>>s1>>s2;
f1=abs(stoi(s1));f2=abs(stoi(s2));
if(!num.count(f1)){
num[f1]=++cnt;
if(s1.length()==4)man.push_back(f1);
else woman.push_back(f1);
}
if(!num.count(f2)){
num[f2]=++cnt;
if(s2.length()==4)man.push_back(f2);
else woman.push_back(f2);
}
gra[num[f1]][num[f2]]=gra[num[f2]][num[f1]]=1;
}
sort(man.begin(),man.end());
sort(woman.begin(),woman.end());
scanf("%d",&K);
while(K--){
cin>>s1>>s2;
bool g1,g2;
f1=abs(stoi(s1));f2=abs(stoi(s2));
if(s1.length()==4)g1=1;
else g1=0;
if(s2.length()==4)g2=1;
else g2=0;
findCD(g1,f1,g2,f2);
}
}