PAT (Advanced Level) Practice - 1139 First Contact(30 分)

简介: PAT (Advanced Level) Practice - 1139 First Contact(30 分)

题目链接:点击打开链接

题目大意:略。

解题思路:

  1. 用数组vis标记两个人是否是朋友(邻接矩阵表示),用vec标记所有人的同性朋友(邻接表表示)unordered_map<int, int> vis 替代二维数组可避免内存超限。
  2. 对于一对想要在一起的A和B,他们需要先找A的所有同性朋友C,再找B的所有同性朋友D,当C和D两人是朋友的时候则可以输出C和D。
  3. A在寻找同性朋友时,需要避免找到他想要的伴侣B,所以当当前朋友就是B或者B的同性朋友就是A时舍弃该结果。
  4. 如果用int接收一对朋友,-0000和0000对于int来说都是0,将无法得知这个人的性别,也就会影响他找他的同性朋友的那个步骤,所以考虑用字符串接收,因为题目中已经表示会以符号位加四位的方式给出输入,所以只要判断字符串是否大小相等,如果大小相等说明这两个人是同性。
  5. 结果数组因为必须按照第一个人的编号从小到大排序(当第一个相等时按照第二个人编号的从小到大排序),所以要用sort对ps数组排序后再输出结果。


AC 代码

#include<bits/stdc++.h>#include<cmath>#define mem(a,b) memset(a,b,sizeof a)#define ssclr(ss) ss.clear(), ss.str("")#define INF 0x3f3f3f3f#define MOD 1000000007usingnamespacestd;
typedeflonglongll;
constintmaxn=1e4+10;
structpeo{
intu,v;
}ps[maxn*10];
unordered_map<int,int>vis;
vector<int>vec[maxn];
intfhash(intid1,intid2)
{
returnid1*10000+id2;
}
intcmp(peop1, peop2)
{
returnp1.u==p2.u?p1.v<p2.v : p1.u<p2.u;
}
intmain()
{
intn,m,u,v,q;
strings1,s2;
stringstreamss;
scanf("%d%d",&n,&m);
for(inti=0;i<m;i++)
    {
cin>>s1>>s2;
ssclr(ss), ss<<s1, ss>>u;
ssclr(ss), ss<<s2, ss>>v;
u=abs(u), v=abs(v);
if(s1.length()==s2.length())
        {
vec[u].push_back(v);
vec[v].push_back(u);
        }
vis[fhash(u,v)]=vis[fhash(v,u)]=1;
    }
scanf("%d",&q);
while(q--)
    {
intl=0;
scanf("%d%d",&u,&v);
u=abs(u), v=abs(v);
for(inti=0;i<vec[u].size();i++)
        {
for(intj=0;j<vec[v].size();j++)
            {
if(vec[u][i]==v||vec[v][j]==u) continue;
if(vis[fhash(vec[u][i],vec[v][j])]==1)
ps[l].u=vec[u][i], ps[l++].v=vec[v][j];
            }
        }
sort(ps,ps+l,cmp);
printf("%d\n",l);
for(inti=0;i<l;i++) printf("%04d %04d\n",ps[i].u,ps[i].v);
    }
return0;
}
目录
相关文章
|
移动开发 C语言
PAT (Advanced Level) Practice 1042 Shuffling Machine (20 分)
PAT (Advanced Level) Practice 1042 Shuffling Machine (20 分)
71 0
PAT (Advanced Level) Practice - 1057 Stack(30 分)
PAT (Advanced Level) Practice - 1057 Stack(30 分)
95 0
PAT (Advanced Level) Practice - 1057 Stack(30 分)
PAT (Advanced Level) Practice - 1016 Phone Bills(25 分)
PAT (Advanced Level) Practice - 1016 Phone Bills(25 分)
101 0
PAT (Advanced Level) Practice - 1147 Heaps(30 分)
PAT (Advanced Level) Practice - 1147 Heaps(30 分)
101 0
PAT (Advanced Level) Practice - 1095 Cars on Campus(30 分)
PAT (Advanced Level) Practice - 1095 Cars on Campus(30 分)
115 0
PAT (Advanced Level) Practice - 1146 Topological Order(25 分)
PAT (Advanced Level) Practice - 1146 Topological Order(25 分)
75 0
|
存储
PAT (Advanced Level) Practice - 1126 Eulerian Path(25 分)
PAT (Advanced Level) Practice - 1126 Eulerian Path(25 分)
119 0
PAT (Advanced Level) Practice - 1062 Talent and Virtue(25 分)
PAT (Advanced Level) Practice - 1062 Talent and Virtue(25 分)
127 0
PAT (Advanced Level) Practice - 1017 Queueing at Bank(25 分)
PAT (Advanced Level) Practice - 1017 Queueing at Bank(25 分)
117 0
PAT (Advanced Level) Practice - 1076 Forwards on Weibo(30 分)
PAT (Advanced Level) Practice - 1076 Forwards on Weibo(30 分)
91 0