#include <cstdio>
#include <algorithm>
using namespace std;
struct Node{
int address;
int data;
int next;
int order;
Node(){
order = 100010;
}
}node[100010];
bool cmp(Node n1, Node n2){
return n1.order < n2.order;
}
int main(){
int h, n, k;
scanf("%d %d %d", &h, &n, &k);
int ad;
for(int i=0; i<n; i++){
scanf("%d", &ad);
node[ad].address = ad;
scanf("%d %d", &node[ad].data, &node[ad].next);
}
int count = 0;
while(h != -1){
node[h].order = count++;
h = node[h].next;
}
sort(node, node+100010, cmp);
int i = 0;
n = count;
int j;
int flag = 0;
while(node[i].order != 100010){
if((i+1) % k == 0){
for(j=i; j>=i-k+2; j--){
printf("%05d %d %05d\n", node[j].address, node[j].data, node[j-1].address);
}
if((i+1) == n){
printf("%05d %d -1\n", node[j].address, node[j].data);
}else{
if(n-(i+1) < k){
flag = 1;
printf("%05d %d %05d\n", node[j].address, node[j].data, node[i+1].address);
}else{
printf("%05d %d %05d\n", node[j].address, node[j].data, node[i+k].address);
}
}
}
if(flag){
for(j=i+1; j<n-1; j++){
printf("%05d %d %05d\n", node[j].address, node[j].data, node[j+1].address);
}
printf("%05d %d -1\n", node[j].address, node[j].data);
return 0;
}
i++;
}
return 0;
}
这题实在有些繁琐,细节很多,要足够细心才行。
注意点是有的测试点给的结点可能会不在链表上,因此要先遍历一遍链表过滤掉无效的结点。