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 分)难度: 一般 / 知识点: 模拟
Codeforces1139D_CF1139DSteps to One (Mobius_DP)