思路:用静态链表存储,cmp函数二级排序
坑:输出时输出的next已经被改变改变为node[i+1].adress;还有可能全部为无效节点需要特判;以及输出格式%05d %d %05d,但是-1需要特殊处理。
#include <iostream>
#include <cstdio>
#include <algorithm>
const int maxn = 100005;
using namespace std;
struct Node
{
int adress;
int key;
int next;
bool flag;
} node[maxn];
bool cmp(Node a,Node b) //二级排序
{
if(a.flag == false||b.flag== false)
{//若存在无效节点按照flag从大到小排序
return a.flag > b.flag;
}
else //全部都是有效节点 按数值从小到大排
{
return a.key < b.key;
}
}
int main()
{
for(int i=0; i<maxn; i++)
{
node[i].flag= false;
}
int n,s;
cin>>n>>s;
int ad,key,next;
for(int i=0; i<n; i++)
{
cin>>ad>>key>>next;
node[ad].adress=ad;
node[ad].key=key;
node[ad].next=next;
}
int p = s,cont = 0;
while(p != -1)
{
node[p].flag = true;
cont++;
p = node[p].next;
}
if(cont == 0)
{
cout <<"0 -1";
}
else
{
sort(node,node + maxn,cmp);
printf("%d %05d\n",cont,node[0].adress);
for(int i = 0; i < cont; i++)
{
if(i != cont-1)
{
printf("%05d %d %05d\n",node[i].adress,node[i].key,node[i+1].adress);
}
else
{
printf("%05d %d -1\n",node[i].adress,node[i].key);
}
}
}
return 0;
}