1139 First Contact (30分) 题目详解

Posted zzlback

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了1139 First Contact (30分) 题目详解相关的知识,希望对你有一定的参考价值。

这道题目给的输入数据  18条,如果没看懂题目意思,去把input数据关系图画出来再分析output,是非常麻烦的(我试过画出18组关系图,非常混乱),然后参考的别的大佬的代码。

 

其实这道题目的题目意思,在开头引言已经说明白了,题目意思大致如下:

 

如果一个人A,喜欢一个人D,A害羞不好意思直接和D说话,A会去找A的同性好朋友B,然后B去找B的好朋友C,但是前提是C是D的同性好朋友,好绕啊。

 

也就是A和B是同性朋友,C和D也是同性朋友,只要B和C也是朋友,就满足条件。但要排除 A和D直接是朋友的情况。

 

那么我们在处理输入的时候,只要把同性朋友存下来,然后用maps去存朋友关系(不管同性异性),因为要留着去判断B和C是否是朋友关系。

 

但要注意一点就是,开始输入18对关系是,不能去用int输入,用string输入,因为-0000,和+0000 int输入得到的都是0,不好判断是否是同性朋友

 

代码如下:

#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<map>
#include<set>
#include<queue>
#include<string>
#include<cmath>
#include<vector>
#include<algorithm>
using namespace std;
int n,m,k;
vector<int> G[10000];
map<int,int> maps;

typedef struct Node{
	int a;
	int b;
}Node;

bool cmp(Node first,Node second){
	//从小到大排序	
	if(first.a != second.a){
		return first.a < second.a;
	}else{
		return first.b < second.b;
	}
}

int main(){

#if ONLINE_JUDGE
#else
	freopen("C:\Users\zzloyxt\Desktop\1.txt","r",stdin);	
#endif	
	scanf("%d %d",&n,&m);
	string a,b;
	int a_int,b_int;  //保存各自的int类型 
	while(m--){
		cin >> a >> b;	
		//将a,b转成int类型 
		sscanf(a.c_str(),"%d",&a_int);
		sscanf(b.c_str(),"%d",&b_int);
		a_int = abs(a_int); 
		b_int = abs(b_int); 
		
		if(a.length() == b.length()){   //a和b是同性朋友,都没有-号,或者都有-号 
			G[a_int].push_back(b_int);
			G[b_int].push_back(a_int);
		}
		maps[10000* a_int + b_int] = maps[10000*b_int + a_int] = 1;  //保存朋友关系 
	}
	
	scanf("%d",&k);
	while(k--){
		cin >> a >> b;	
		//将a,b转成int类型 
		sscanf(a.c_str(),"%d",&a_int);
		sscanf(b.c_str(),"%d",&b_int);
		a_int = abs(a_int); 
		b_int = abs(b_int);
		vector<Node> ans;
		for(int i=0;i<G[a_int].size();i++){
			for(int j=0;j<G[b_int].size();j++){
				if(G[a_int][i] == b_int || G[b_int][j] == a_int){
					continue;  //a和b本身是朋友 
				}else{
					if(maps[10000 * G[a_int][i] + G[b_int][j]] == 1){  
						// a的朋友和b的朋友是朋友关系
						Node node = {G[a_int][i],G[b_int][j]};
						ans.push_back(node);					
					}
				} 
								
			}
		}
		sort(ans.begin(),ans.end(),cmp);
		printf("%d
",ans.size()); 
		for(int i=0;i<ans.size();i++){
			printf("%04d %04d
",ans[i].a,ans[i].b);
		}
		
	}
	
	return 0;
}

  

 

以上是关于1139 First Contact (30分) 题目详解的主要内容,如果未能解决你的问题,请参考以下文章

1139 First Contact (30分) 题目详解

1139 First Contact (30 分)难度: 一般 / 知识点: 模拟

PAT1139First Contact (30)

Codeforces1139D_CF1139DSteps to One (Mobius_DP)

Entity Framework - CTP4 - Code First - 如何关闭自动复数?

Contact项目梳理