这道题就是对vector的巧用,我们先定义一个模仿链表的结构数组
struct list
{
int data;
int next;
}node[100001];
之后我们设法将此链表读入,这道题建议用,scanf和printf最后两个测试点可能会超时读入方法为
int first,num;scanf("%d %d",&first,&num);
for(int i=1;i<=num;i++)
{
int addd1,data1,addd2;scanf("%d %d %d",&addd1,&data1,&addd2);
node[addd1].data=data1;
node[addd1].next=addd2;
}
然后我们设两个vector数组保存正确值和重复的值设置一个find函数将是否有重复元素判断出来
int find(vector>&num,int x) { for(int i=0;i 之后就是我们的筛选操作
while(head0!=-1) { int numb=abs(node[head0].data); if(find(num1,numb)) { num1[0].push_back(node[head0].data); num1[1].push_back(head0); } else { add1[0].push_back(node[head0].data); add1[1].push_back(head0); } head0=node[head0].next; }这里说明一下我这里将vector定义的是一个嵌套的,有两层一层装值,一层装假地址。
vector>num1(2);//装不重复的元素 vector >add1(2);//装重复的元素 最后就是输出操作很简单,最后一个单独输出即可
int i; for(i=0;i=0&&i #includeusing namespace std; struct list { int data; int next; }node[100001]; int find(vector >&num,int x) { for(int i=0;i >num1(2); int first,num;scanf("%d %d",&first,&num); for(int i=1;i<=num;i++) { int addd1,data1,addd2;scanf("%d %d %d",&addd1,&data1,&addd2); node[addd1].data=data1; node[addd1].next=addd2; } vector >add1(2); int n=0; int head0=first; if(node[head0].next==-1){printf("%05d %d -1n",head0,node[head0].data);return 0;} while(head0!=-1) { int numb=abs(node[head0].data); if(find(num1,numb)) { num1[0].push_back(node[head0].data); num1[1].push_back(head0); } else { add1[0].push_back(node[head0].data); add1[1].push_back(head0); } head0=node[head0].next; } int i; for(i=0;i =0&&i



