思路: s t r u c t + struct+ struct+排序。 坑点: 1.答案只包含从原链表中头结点开始的结点,有点结点不在原链表上不用考虑。 2.头结点可能不存在,直接输出 0 − 1 0 -1 0−1。
#include<bits/stdc++.h> using namespace std; typedef long long ll; const int N=1e5+5,M=2e4+5,inf=0x3f3f3f3f,mod=1e9+7; #define mst(a,b) memset(a,b,sizeof a) #define lx x<<1 #define rx x<<1|1 #define reg register #define PII pair<int,int> #define fi first #define se second #define pb push_back #define il inline int n,head; struct Node{ int val,nt; }a[N]; struct node{ int id,val; bool operator<(const node& no)const{ return val<no.val; } }; int main(){ scanf("%d%d",&n,&head); vector<node>v; for(int i=1;i<=n;i++){ int id; scanf("%d",&id); scanf("%d%d",&a[id].val,&a[id].nt); } while(~head){ v.pb({head,a[head].val}); head=a[head].nt; } if(v.empty()){ puts("0 -1"); return 0; } sort(v.begin(),v.end()); printf("%d %05d\n",v.size(),v[0].id); n=v.size(); for(int i=0;i<n;i++){ if(!i) printf("%05d %d ",v[0].id,v[0].val); if(i<n-1) printf("%05d\n%05d %d ",v[i+1].id,v[i+1].id,v[i+1].val); else if(i==n-1) printf("-1\n"); } return 0; }