1139 First Contact

#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;
}


 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值