2017 ACM-ICPC 亚洲区(乌鲁木齐赛区)网络赛(A题: Banana(枚举))

在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述
题意:给你猴子编号和香蕉编号的联系,香蕉编号和厂家编号的联系,让你输出 猴子通过相应的香蕉到相应香蕉到的厂家的 猴子和相应厂家的编号(成对输出);
其实这道题可以这样理解:
比如第一个案例:
在这里插入图片描述
很明显就是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版权协议,转载请附上原文出处链接和本声明。