#include<iostream>
#include<vector>
#include<map>
#include<cmath>
#include<bits/stdc++.h>
using namespace std;
struct Node{
int a;
int b;
};
bool cmp(Node aa,Node bb){
if(aa.a!=bb.a){
return aa.a<bb.a;
}else{
return aa.b<bb.b;
}
}
int main()
{
#ifdef ONLINE_JUDGE
#else
freopen("in.txt","r",stdin);
//freopen("out.txt","w",stdout);
#endif
int n,k;
map<int,int> hash;
vector<int> re[10000];
cin>>n>>k;
for(int i=0;i<k;i++){
int temp1,temp2;
cin>>temp1>>temp2;
if(temp1<0){
hash[abs(temp1)]=-1;
}else{
hash[temp1]=1;
}
if(temp2<0){
hash[abs(temp2)]=-1;
}else{
hash[temp2]=1;
}
re[abs(temp1)].push_back(abs(temp2));
re[abs(temp2)].push_back(abs(temp1));
}
int m;
cin>>m;
for(int i=0;i<m;i++){
int temp1,temp2;
cin>>temp1>>temp2;
vector<Node> node;
for(int j=0;j<re[abs(temp1)].size();j++){
for(int t=0;t<re[abs(temp2)].size();t++){
Node temp3;
if(hash[abs(temp1)]==hash[re[abs(temp1)][j]]&&hash[abs(temp2)]==hash[re[abs(temp2)][t]]){
temp3.a=re[abs(temp1)][j];
temp3.b=re[abs(temp2)][t];
node.push_back(temp3);
}
}
}
vector<Node> node1;
for(int j=0;j<node.size();j++){
int flag=0;
for(int t=0;t<re[node[j].b].size();t++){
if(re[node[j].b][t]==node[j].a){
//cout<<node[j].a<<' '<<node[j].b<<"****"<<endl;
flag=1;break;
}
//cout<<node[j].b<<' '<<node[j].a<<endl;
}
if(flag==1){
//node.erase(node.begin()+j);
node1.push_back(node[j]);
}
}
cout<<node1.size()<<endl;
sort(node1.begin(),node1.end(),cmp);
for(int q=0;q<node1.size();q++){
cout<<node1[q].a<<' '<<node1[q].b<<endl;
}
node.clear();
node1.clear();
}
return 0;
}
下面是AC代码,注意点在最长的那一行代码上,感觉PAT的测试用例数据应该很小,不然为毛三层循环都能AC。。。
上面代码18分的,小白时候写的就留在那吧~
#include<bits/stdc++.h>
using namespace std;
const int MAXN=10100;
struct Node{
int gender;
vector<int> friends;
Node(){
gender=0;
}
}node[MAXN];
int main()
{
freopen("in.txt","r",stdin);
int n,m;cin>>n>>m;
unordered_map<int,bool> mp;
for(int i=0;i<m;i++){
string id1,id2;
cin>>id1>>id2;
int flag1=0,flag2=0;
if(id1[0]=='-'){
flag1=1;id1=id1.substr(1);
}
if(id2[0]=='-'){
flag2=1;id2=id2.substr(1);
}
int ID1=stoi(id1);
int ID2=stoi(id2);
if(flag1==1) node[ID1].gender=1;
node[ID1].friends.push_back(ID2);
if(flag2==1) node[ID2].gender=1;
node[ID2].friends.push_back(ID1);
mp[ID1*10000+ID2]=mp[ID2*10000+ID1]=true;
}
int k;cin>>k;
for(int i=0;i<k;i++){
string aa,bb;cin>>aa>>bb;
int a=abs(stoi(aa));int b=abs(stoi(bb));
sort((node[a].friends).begin(),(node[a].friends).end());
sort(node[b].friends.begin(),node[b].friends.end());
vector<int> ppp;
for(int j=0;j<node[a].friends.size();j++){
for(int t=0;t<node[b].friends.size();t++){
int f1=node[a].friends[j];
int f2=node[b].friends[t];
if((mp[f1*10000+f2]==true||mp[f2*10000+f1]==true)&&(node[f1].gender==node[a].gender)&&(node[f2].gender==node[b].gender)&&(f1!=b&&f2!=a)){
ppp.push_back(node[a].friends[j]);
ppp.push_back(node[b].friends[t]);
}
}
}
cout<<ppp.size()/2<<endl;
for(int j=0;j<ppp.size();j+=2){
printf("%04d %04d\n",ppp[j],ppp[j+1]);
}
ppp.clear();
}
return 0;
}