磊神的慈悲

链接:登录—专业IT笔试面试备考平台_牛客网
来源:牛客网
 

一天 jbgg 被磊神赶出了实验室。第二天 jbgg 想进入实验室的时候发现门的密码被磊神修改了,幸运的是博爱的磊神给 jbgg 留下了一张纸条,上面有一个数字串和一张数字转换表,只要 jbgg 能获取密码就能再次进入实验室。

一个数字串由 n 个正整数 x1​,x2​,⋯,xn​ 组成。

转换表有 m 行,每行一个转换组,每个转换组的形式为 a→b,表示数字 a 转换成数字 b,如:3→4。

jbgg 猜到只要将数字串中出现在转换表中的所有数字按照转换表进行连续转换,直至无法再次转换后得到的数字串便是最终密码。但磊神给的数字串太长了,jbgg 无法完成所有转换,你能写一个程序帮助 jbgg 完成转换吗?

输入描述:

第一行两个正整数 n, m (1⩽n⩽105, 1⩽m⩽103),分别表示要解密的数字串长度和转换表的行数。

接下来一行有 n个用空格分隔的正整数 x1​,x2​,⋯,xn​ (1⩽xi​⩽105),表示待解密的数字串。

接下来 m 行,每行两个正整数 a, b (1⩽a,b⩽105),表示从 a 转换到 b,保证每种转换仅出现一次。

数据保证不会出现一个数字可以转换成多个数字以及一个数字经过连续转换后会变回自身的情况。

输出描述:

输出一行 n 个正整数,数字之间用空格隔开。

示例1

输入

5 4
1 2 3 4 5
1 4
3 4
4 5
2 1

输出

5 5 5 5 5

说明

所有的连续转换如下:

2→1→4→53→4→5

数字串 1,2,3,4,5 中的每个数字在经过连续转换后变成 5,5,5,5,5。

示例2

输入

18 16
1 2 3 4 5 6 7 8 233 9 10 3 5 11 12 13 14 15
15 48
14 53
1 67
12 77
6 84
11 86
3 97
10 100
13 101
7 104
2 114
233 2
9 115
8 117
5 121
4 122

输出

67 114 97 122 121 84 104 117 114 115 100 97 121 86 77 101 53 48

 

开个数组储存一下变化过程

 

#include <iostream>

using namespace std;

int main(){
   int n,m,a[100010],b[100010];
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;i++){
        scanf("%d",&a[i]);
    }
    for(int i=1;i<=100010;i++){
        b[i]=i;
    }
    while(m--){
        int x,y;
        scanf("%d%d",&x,&y);
        for(int i=1;i<=n;i++){
            if(a[i]==x){
                a[i]=b[y];
            }
            if(b[i]==x){
                b[i]=b[y];
            }
        }
    }
  for(int i=1;i<=n;i++){
      if(i==1) {
          printf("%d", a[i]);
      }
      else
          printf(" %d",a[i]);
  }
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

q619718

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值