//1052 有些节点并不属于链表,因此单纯排序,会有一个case过不去 #include <iostream> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <string> #include <vector> #include <algorithm> #include <queue> #define MAX_SIZE 100010 using namespace std; typedef struct Node { int _address; int key; int next; }; bool cmp(Node n1,Node n2) { return n1.key < n2.key; } int main() { int N,i; int head_first; int _address; int next; int key; while(cin>>N>>head_first) { vector<Node>vec_s1(MAX_SIZE); vector<Node>vec_s2(MAX_SIZE); for(i = 0 ;i < N;i++) { cin>>_address >>key>>next; vec_s1[_address]._address = _address; //地址作为索引,方便查找,哈希 vec_s1[_address].key = key; vec_s1[_address].next = next; } int temp = head_first; int top = 0; while(temp != -1) //遍历链表,保存成数组 { vec_s2[top]._address = vec_s1[temp]._address; vec_s2[top].key = vec_s1[temp].key; vec_s2[top].next = vec_s1[temp].next; temp = vec_s1[temp].next; top++; } sort(vec_s2.begin(),vec_s2.begin() + top,cmp); if(top == 0) { printf("0 -1\n"); } else{ printf("%d %05d\n",top,vec_s2[0]._address); for(i = 0;i < top-1;i++) //按照排好序,连接起来 { printf("%05d %d %05d\n",vec_s2[i]._address,vec_s2[i].key,vec_s2[i+1]._address); } printf("%05d %d -1\n",vec_s2[top-1]._address,vec_s2[top-1].key); } } return 0; }