



题意:给你猴子编号和香蕉编号的联系,香蕉编号和厂家编号的联系,让你输出 猴子通过相应的香蕉到相应香蕉到的厂家的 猴子和相应厂家的编号(成对输出);
其实这道题可以这样理解:
比如第一个案例:
很明显就是1猴子能通过1号香蕉到达1,3;2…猴子同理;
思路:
利用邻接表存有向图,然后三个for枚举即可;
但是要求输出按照 字典序输出,所以我用pair然后sort一下就可以了;
注意这里会有两个2,3出现,但是我可以用一个book数组标记一下就可以了
AC代码:
#include <bits/stdc++.h>
using namespace std;
vector<int> mon[100],pla[100];
pair<int,int> p[100];
int book[100][100];
int T;
int main()
{
scanf("%d",&T);
while(T--){
memset(book,0,sizeof(book));
for(int i=0;i<100;i++){
mon[i].clear();pla[i].clear();
}
int n,m;
scanf("%d%d",&n,&m);
for(int i=0;i<n;i++){
int a,b;
scanf("%d%d",&a,&b);
mon[a].push_back(b);
}
for(int i=0;i<m;i++){
int a,b;
scanf("%d%d",&a,&b);
pla[a].push_back(b);
}
int num=0;
for(int i=0;i<=100;i++){//这里其实开60也就够了,因为题目给的数据很小
if(mon[i].size()==0)continue;
sort(mon[i].begin(),mon[i].end());//排个序
for(int j=0;j<mon[i].size();j++){
if(pla[mon[i][j]].size()==0)continue;
sort(pla[mon[i][j]].begin(),pla[mon[i][j]].end());
for(int y=0;y<pla[mon[i][j]].size();y++){//通过香蕉标号能到的厂家
if(!book[i][pla[mon[i][j]][y]]){
book[i][pla[mon[i][j]][y]]=1;
p[num].first=i;p[num++].second=pla[mon[i][j]][y];//存入pair中
}
}
}
}
sort(p,p+num);//排个序
for(int i=0;i<num;i++)printf("%d %d\n",p[i].first,p[i].second);
puts("");//注意这里是题目要求的
}
return 0;
}
版权声明:本文为qq_44555205原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。