思路
为了将删除的和未删除的分开我们给他们赋权(node[i].key),然后按权值排序后即为所求。
然后在存储链式结构的时候可以采取类似于链式前向星的方法,
[next存储下一个节点位置的地址\th意为this存储这个位置的地址\val则为边权
]
这里改了的是结构体的(node[i])即为存储地址,然后去标记访问遍历模拟就可以了。
#include <bits/stdc++.h>
#define endl '
'
using namespace std;
int head,n;
const int maxn=1e5;
int vis[100010];
struct node{
int val,next,key,th;
bool operator <(const node x)const{
return key<x.key;
}
}node[100010];
int main(){
scanf("%d%d",&head,&n);
for(int i=0;i<maxn+5;++i)node[i].key=maxn*2;
for(int i=0;i<n;++i){
int a;scanf("%d",&a);
scanf("%d%d",&node[a].val,&node[a].next);
node[a].th=a;
}
int cnt1=0,cnt2=0;
for(int i=head;i!=-1;i=node[i].next){
if(vis[abs(node[i].val)]){
node[i].key=maxn+(++cnt1);
}else{
vis[abs(node[i].val)]=1;
node[i].key=++cnt2;
}
}
sort(node,node+maxn+1);
int cnt=cnt1+cnt2;
for(int i=0;i<cnt;++i){
if(i!=cnt2-1&&i!=cnt-1){
printf("%05d %d %05d
",node[i].th,node[i].val,node[i+1].th);
}else{
printf("%05d %d -1
",node[i].th,node[i].val);
}
}
}