1139. First Contact 解析

这个题真的是恶意满满... 找同性的你们还找中间人 emmmmm 

如果把4位id当作整数去处理就会遇到极大的坑:

1.有小于4位的值,输出的时候需要补零

2.最大的坑.case2中会有-0000 http://blog.csdn.net/gl486546/article/details/78816363 看这个大神的帖子才发现这个问题,之前想到了0点会有问题 ,但是真的没有想到会出-0这样的坑.

所以还是用string读入在处理比较好

除了上面的问题之外,还有一个会有问题的地方就是,A,B的中间人 C,D是不能有A,B的,特别注意这个点.

PS.程序写的贼傻,后面再慢慢改了.

#include <iostream>
#include <cstring>
#include <climits>
#include <algorithm>
#include <string>
#include <vector>
#include <map>
#include <stack>
#include <queue>
#include <set>

#define MAX 10010
#define MAX2 310


using namespace std;

struct node{
	bool isGirl;
	int boy[MAX2];
	int girl[MAX2];
	int bnum;
	int gnum;
	node(){bnum=gnum=-1;};
};
node m[MAX];

struct ansnode{
	int id1;
	int id2;
};

bool cmp(ansnode n1 ,ansnode n2){
	if(n1.id1 != n2.id1)
		return n1.id1 < n2.id1;
	return n1.id2 < n2.id2;
}

void DFS(int i1, int i2 ,bool g1,bool g2){
	vector <ansnode> ans;
	if(!g1 && g2){//boy -> girl
		for(int i = 0 ;i <= m[i1].bnum ;i++){//boy's girl friends
			int u = m[i1].boy[i];
			for(int j = 0 ; j <= m[u].gnum; j++){//girl's girl friends
				int v = m[u].girl[j];
				for(int z = 0; z <= m[v].gnum;z++){//isEqual i2
					if(i1 != v && i2 !=v && i1 != u && i2 !=u && i2 == m[v].girl[z]){//u,v != i1,i2
					ansnode temp;
					temp.id2 = v;
					temp.id1 = u;
					ans.push_back(temp);
					break;
					}
				}
			}
		}
	}
	else if(g1 && !g2){//girl -> boy
		for(int i = 0 ;i <= m[i1].gnum; i++){
			int u = m[i1].girl[i];
			for(int j = 0;j <= m[u].bnum ;j++){
				int v = m[u].boy[j];
				for(int z = 0; z <= m[v].bnum;z++){
					if(i1 != v && i2 !=v &&i1 != u && i2 !=u &&i2 == m[v].boy[z]){
					ansnode temp;
					temp.id2 = v;
					temp.id1 = u;
					ans.push_back(temp);
					break;
					}
				}
			}
		}
	}
	else if(g1 && g2){//girl -> girl
		for(int i = 0 ;i <= m[i1].gnum ;i++){
			int u = m[i1].girl[i];
			for(int j = 0 ; j <= m[u].gnum; j++){
				int v = m[u].girl[j];
				for(int z = 0; z <= m[v].gnum;z++){
					if(i1 != v && i2 !=v &&i1 != u && i2 !=u && i2 == m[v].girl[z]){
					ansnode temp;
					temp.id2 = v;
					temp.id1 = u;
					ans.push_back(temp);
					break;
					}
				}
			}
		}
	}
	else{//boy->boy
		for(int i = 0 ;i <= m[i1].bnum ;i++){
			int u = m[i1].boy[i];
			for(int j = 0 ; j <= m[u].bnum; j++){
				int v = m[u].boy[j];
				for(int z = 0; z <= m[v].bnum;z++){
					if(i1 != v && i2 !=v &&i1 != u && i2 !=u && i2 == m[v].boy[z]){
					ansnode temp;
					temp.id2 = v;
					temp.id1 = u;
					ans.push_back(temp);
					break;
					}
				}
			}
		}
	}
	cout << ans.size() << endl;
	if(ans.size() != 0)
		sort(ans.begin(),ans.end(),cmp);
	for(int i = 0 ;i < ans.size() ;i++){
//		cout << ans[i].id1 << " " << ans[i].id2 << endl;
		printf("%04d %04d\n",ans[i].id1,ans[i].id2);
	}
}


int n,k;

int str2int(string s, bool isGirl){
	int num = 0;
	if(isGirl){
		for(int i = 1; i < s.size() ;i++){
			num *= 10;
			num += ( s[i] - '0');
		}
	}
	else{
		for(int i = 0; i < s.size() ;i++){
			num *= 10;
			num += ( s[i] - '0');
		}
	}
	return num;
}


int main(){
	
	scanf("%d%d",&n,&k);
	for(int i = 0;i < k ;i++){
		int id1,id2;
		bool g1 = false;
		bool g2 = false;
		string d1,d2;
		cin >> d1 >> d2;
		if(d1[0] == '-')
			g1= true;
		if(d2[0] == '-')
			g2= true;
		id1 = str2int(d1,g1);
		id2 = str2int(d2,g2);

		m[id1].isGirl = g1;
		m[id2].isGirl = g2;
		if(g1)
			m[id2].girl[++m[id2].gnum] = id1;
		else
			m[id2].boy[++m[id2].bnum] = id1;

		if(g2)
			m[id1].girl[++m[id1].gnum] = id2;
		else
			m[id1].boy[++m[id1].bnum] = id2;
	}

	int z;
	scanf("%d",&z);
	for(int i = 0; i < z ;i++){
		int id1,id2;
		bool g1 = false;
		bool g2 = false;
		string d1,d2;
		cin >> d1 >> d2;
		if(d1[0] == '-')
			g1= true;
		if(d2[0] == '-')
			g2= true;
		id1 = str2int(d1,g1);
		id2 = str2int(d2,g2);

		DFS(id1,id2,g1,g2);
	}



	return 0;
}






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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值