蒜头君有 n n n 块积木,编号分别为 1 1 1 到 n n n。
一开始,蒜头把第 i i i 块积木放在位置 i i i。
蒜头君进行 m m m 次操作,每次操作,蒜头把位置 b b b 上的积木整体移动到位置 a a a 上面。
比如 1 1 1 位置的积木是 1 1 1, 2 2 2 位置的积木是 2 2 2,那么把位置 2 2 2 的积木移动到位置 1 1 1 后,位置 1 1 1 上的积木从下到上依次为 1 , 2 1,2 1,2。
输入格式
第一行输入 2 2 2 个整数 n , m ( 1 ≤ n ≤ 10000 , 0 ≤ m ≤ 10000 ) n,m(1 \le n \le 10000, 0 \le m \le 10000) n,m(1≤n≤10000,0≤m≤10000)。
接下来 m m m 行,每行输入 2 2 2 个整数 a , b ( 1 ≤ a , b ≤ n ) a, b(1 \le a, b \le n) a,b(1≤a,b≤n),如果 a a a, b b b 相等则本次不需要移动。
输出格式
输出 n n n 行,第 i i i 行输出位置 i i i 从下到上的积木编号,如果该行没有积木输出一行空行。
样例输入
2 2
1 2
1 2
样例输出
1 2
样例输入
4 4
3 1
4 3
2 4
2 2
样例输出
2 4 3 1
代码
#include<iostream>
//#include <bits/stdc++.h>
#include<vector>
using namespace std;
int main()
{
int n,m,a,b,i,j;
cin>>n>>m;
vector<int> vec[10010];
for(i=1;i<=n;i++)
vec[i].push_back(i);
for(i=0;i<=m;i++)
{
cin>>a>>b;
if(vec[b].empty() || a==b)
continue;
else
{
for(i=0;i<vec[b].size();i++)
vec[a].push_back(vec[b][i]);
vec[b].clear();
{
vector<int> V;
vec[b].swap(V);
}
}
}
for(i=1;i<=n;i++)
if(vec[i].empty())
cout<<endl;
else
{
for(j=0;j<vec[i].size();j++)
if(j==vec[i].size()-1)
cout<<vec[i][j]<<endl;
else
cout<<vec[i][j]<<" ";
}
return 0;
}