C++合并数字

题目描述

1-n,共n个数字,初始时每个数都是独立的算作1个串,之后会进行n-1次合并,每次合并操作,会把一个串放到另一个串的后面。

合并时会给出2个数字,x y,表示将以y为开头的串放到x为开头的串的后面。例如:

1 3 (3放到1后面,=> (1 3), 2, 4 )

2 4 (4放到2后面,=> (1 3), (2 4))

1 2 (2放到1后面,=> (1 3 2 4))

在n - 1次合并后,按顺序输出最终剩下的这个串的全部数字。

输入格式

第1行:1个数n(2 <= n <= 10000) 后面n - 1行,每行2个数x y,对应n - 1次合并操作,把以y为开头的串放到以x为开头的串的末尾。

输出格式

输出共n行,每行1个数,对应最终串包含的n个数字。

样例
输入样例
4
1 3
2 4
1 2
输出样例
1
3
2
4

题解:

#include <bits/stdc++.h>
using namespace std;
struct node {
    int next, tail;
} nodes[10010];
bool isnext[10010];
int n;
int main() {
    cin >> n;
    for (int i = 1; i <= n; i++) {
        nodes[i].tail = i;
    }
    for (int i = 1; i < n; i++) {
        int a, b;
        cin >> a >> b;
        nodes[nodes[a].tail].next = b;
        nodes[a].tail = nodes[b].tail;
        isnext[b] = true;
    }
    int head = 0;
    for (int i = 1; i <= n; i++) {
        if (!isnext[i]) {
            head = i;
        }
    }
    for (int p = head; p != 0; p = nodes[p].next) {
        cout << p << endl;
    }
    return 0;
}

 

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值