链接:登录—专业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]);
}
}