问题 C: 瑞神要考研
时间限制: 1 Sec 内存限制: 128 MB提交: 219 解决: 43
[ 提交][ 状态][ 讨论版]
题目描述
瑞神要准备考研了,为了复习数据结构,瑞神在某宝上买了一本数据结构得考研辅导资料《考研数据结构---从入门到放弃》,从此瑞神开始了愉快的复(zhuang)习(bi)。
有一天,瑞神找了好多条链表来辅助自己复习,但是他在复习的过程中一不小心把链表掉在了地上,捡起来的时候链表以及断成了好多个结点,每个结点只保留了当前结点的地址、结点的值和下一个结点的地址。瑞神看着这些结点浑身难受无法复习,为了让瑞神继续复(zhuang)习(bi)下去,请你帮瑞神把链表复原。
有一天,瑞神找了好多条链表来辅助自己复习,但是他在复习的过程中一不小心把链表掉在了地上,捡起来的时候链表以及断成了好多个结点,每个结点只保留了当前结点的地址、结点的值和下一个结点的地址。瑞神看着这些结点浑身难受无法复习,为了让瑞神继续复(zhuang)习(bi)下去,请你帮瑞神把链表复原。
输入
第一行给出结点的个数n(1<=n<=100000)。
接下来n行每行给出一个结点的信息:结点地址、值和下一个结点的地址。
地址为5位数字,-1表示地址为NULL。
保证每一条链表的最后一个结点的下一个结点地址为-1。
接下来n行每行给出一个结点的信息:结点地址、值和下一个结点的地址。
地址为5位数字,-1表示地址为NULL。
保证每一条链表的最后一个结点的下一个结点地址为-1。
输出
每一行输出一条链表,只输出每个节点的值。多条链表按照首结点地址从小到大排序。
因为题目要求的是按照每条链表的首节点的地址排序,并且指定了尾节点,所以倒着链接链表,然后找出链表里的值保存下来,然后正向输出即可。
#include<iostream> #include<vector> #include<string> #include<algorithm> #include<map> #include<cstdio> #include <cstring> using namespace std; const int maxn = 100000+10; int T; struct Node { int in,value,next; }; struct List { Node x; vector<int>Vc; int in; }; List V[maxn]; vector<Node>Ve; Node s[maxn]; map<int,int> Map; map<int,int> Value; bool cmp(const List& t1,const List& t2) { return t1.in<t2.in; } int main() { scanf("%d",&T); for(int i=0;i<T;i++) { scanf("%d%d%d",&s[i].in,&s[i].value,&s[i].next); Map[s[i].next]=s[i].in; Value[s[i].in]=s[i].value; if(s[i].next==-1) { Ve.push_back(s[i]); } } for(int i=0;i<Ve.size();i++) { int t= Ve[i].in ; while(1) { if(t==0) break; V[i].Vc.push_back( Value[ t ] ); V[i].in=t; t=Map[t]; } // for(int j=Vc[i].size()-1;j>=0;j--) // { // if(j==Vc[i].size()-1) // cout << Vc[i][j] ; // else cout<< " " << Vc[i][j] ; // } // cout << endl; } sort(V,V+Ve.size(),cmp); for(int i=0;i<Ve.size();i++) { for(int j=V[i].Vc.size()-1;j>=0;j--) { cout << V[i].Vc[j] << " "; } cout << endl; } return 0; }