输入格式:
输入第一行包含链表第一个结点的地址、以及结点个数N(<= 105 的正整数)。结点地址是一个非负的5位整数,NULL指针用-1表示。
随后N行,每行按下列格式给出一个结点的信息:
Address Key Next
其中Address是结点的地址,Key是绝对值不超过104的整数,Next是下一个结点的地址。
输出格式:
首先输出去重后的链表,然后输出被删除结点组成的链表。每个结点占一行,按输入的格式输出。
直接数组模拟链表。
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include<map>
#include<algorithm>
#define inf 0x3f3f3f3f
#define LL __int64
#include<queue>
using namespace std;
struct node{
int w,next;
}now[100010];
bool vis[100010];
int now1[100010],del1[100010];
int main(){
int n,m,i,j,k,st,id,c,nt,s1,s2;
while(~scanf("%d%d",&st,&n)){
s2 = s1 = 0;
for(i = 0;i < n;++ i){
scanf("%d%d%d",&id,&c,&nt);
now[id].w = c;
now[id].next = nt;
}
memset(vis,false,sizeof(vis) );
for(i = 0;i < n && (~st);++ i){
int tmp = now[st].w;
if(tmp < 0)
tmp *= -1;
if(!vis[ tmp ] ){
now1[s1++] = st;
vis[tmp] = true;
}
else
del1[s2++] = st;
st = now[st].next;
}
if(s1){
for(i = 0;i < s1;++ i){
if(!i)
printf("%05d %d",now1[i],now[ now1[i] ].w);
else
printf(" %05d\n%05d %d",now1[i],now1[i],now[now1[i] ].w);
}
puts(" -1");
}
if(s2){
for(i = 0;i < s2;++ i){
if(!i)
printf("%05d %d",del1[i],now[ del1[i] ].w);
else
printf(" %05d\n%05d %d",del1[i],del1[i],now[del1[i] ].w);
}
puts(" -1");
}
}
return 0;
}