问题 C: 瑞神要考研
时间限制: 1 Sec 内存限制: 128 M题目描述
瑞神要准备考研了,为了复习数据结构,瑞神在某宝上买了一本数据结构得考研辅导资料《考研数据结构---从入门到放弃》,从此瑞神开始了愉快的复(zhuang)习(bi)。
有一天,瑞神找了好多条链表来辅助自己复习,但是他在复习的过程中一不小心把链表掉在了地上,捡起来的时候链表以及断成了好多个结点,每个结点只保留了当前结点的地址、结点的值和下一个结点的地址。瑞神看着这些结点浑身难受无法复习,为了让瑞神继续复(zhuang)习(bi)下去,请你帮瑞神把链表复原。
有一天,瑞神找了好多条链表来辅助自己复习,但是他在复习的过程中一不小心把链表掉在了地上,捡起来的时候链表以及断成了好多个结点,每个结点只保留了当前结点的地址、结点的值和下一个结点的地址。瑞神看着这些结点浑身难受无法复习,为了让瑞神继续复(zhuang)习(bi)下去,请你帮瑞神把链表复原。
输入
第一行给出结点的个数n(1<=n<=100000)。
接下来n行每行给出一个结点的信息:结点地址、值和下一个结点的地址。
地址为5位数字,-1表示地址为NULL。
保证每一条链表的最后一个结点的下一个结点地址为-1。
接下来n行每行给出一个结点的信息:结点地址、值和下一个结点的地址。
地址为5位数字,-1表示地址为NULL。
保证每一条链表的最后一个结点的下一个结点地址为-1。
输出
每一行输出一条链表,只输出每个节点的值。
多条链表按照首结点地址从小到大排序。
多条链表按照首结点地址从小到大排序。
样例输入
3
00323 155 -1
00322 87 00323
00233 1 -1
样例输出
1
87 155
题目比较坑,可能水平太低,之前想的结构体存储太智障,后来和队友讨论的三数组分别存储,思路是正确的,结果存在bug,郁闷了好久,结果错在了标记上。。。。
解题思路:
因为地址是5位的,所以可以直接从头遍历;
<1> 创建 ru 数组存储哪个是起始点,起始点的入度为零;
<2> 创建used数组存储这个地址是否使用过,为后续的遍历提供方便。
<3> 创建next 数组存储当前地址的下一个地址;
<4> 创建value数组存储当前地址存储的数值。
上代码:
#include<cstdio>
#include<cstring>
using namespace std;
int next[100010];
int used[100010];
int ru[100010];
int value[100010];
int main()
{
memset(next,-1, sizeof(next));
memset(used, 0, sizeof(used));
memset(ru,0,sizeof(ru));
memset(value,-1,sizeof(value));
int a,b,c;
int n;
scanf("%d",&n);
for(int i=0;i<n;i++)
{
scanf("%d %d %d",&a,&b,&c);
if(c!=-1){ru[c]=1;used[c]=1;}
used[a]=1;
value[a] = b;
next[a] = c;
}
for(int i=0;i<=99999;i++)
{
if( !(ru[i]==0&&used[i]==1) )continue;
int cur = i;
int first = 0;
while(cur!=-1)
{
if(!first)
printf("%d", value[cur]);
else
printf(" %d",value[cur]);
cur = next[cur];
first = 1;
}
printf("\n");
}
return 0;
}
//水波。