题目
code
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
const int maxn=100010;
struct Node{
int data;
int next;
int address;
bool flag;
}node[maxn];
bool cmp(Node a,Node b){
if(a.flag!=true||b.flag!=true){//无效结点就放在后面
return a.flag>b.flag;}
else{
return a.data<b.data;
}
}
int main(){
int n,begin;
scanf("%d %d",&n,&begin);
int address;
for(int i=0;i<n;i++){
scanf("%d",&address);
scanf("%d %d",&node[address].data,&node[address].next);//node 【address】
node[address].address=address;
}
//init
for(int i=0;i<maxn;i++){
node[i].flag=false;
}
int p;
int count=0;
for(p=begin;p!=-1;p=node[p].next){// 有效结点 !!计数
node[p].flag=true;
count++;
}
if(count==0){
printf("0 -1");
}
else{
sort(node,node+maxn,cmp);
printf("%d %05d\n",count,node[0].address);//防止-1被%05d化
for(int i=0;i<count;i++){
if(i!=count-1){
printf("%05d %d %05d\n",node[i].address,node[i].data,node[i+1].address);// i+1.address
}else{
printf("%05d %d -1\n",node[i].address,node[i].data);
}
}
}
return 0;
}
总结
-
初始化后 检查有效结点 并使用count记录结点个数
-
若为无效结点,针对情况进行特殊输出
-
node[address] 而不是 node[i]
-