这道题就是对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<vector<int> >&num,int x)
{
for(int i=0;i<num[0].size();i++)
{
if(abs(num[0][i])==x)return 0;
}
return 1;
}
之后就是我们的筛选操作
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<vector<int> >num1(2);//装不重复的元素
vector<vector<int> >add1(2);//装重复的元素
最后就是输出操作很简单,最后一个单独输出即可
int i;
for(i=0;i<num1[0].size()-1;i++)
{
printf("%05d %d %05d\n",num1[1][i],num1[0][i],num1[1][i+1]);
}
if(i>=0&&i<num1[0].size())printf("%05d %d -1\n",num1[1][i],num1[0][i]);
for(i=0;i<add1[0].size()-1;i++)
{
printf("%05d %d %05d\n",add1[1][i],add1[0][i],add1[1][i+1]);
}
if(i>=0&&i<add1[0].size())printf("%05d %d -1\n",add1[1][i],add1[0][i]);
#include<bits/stdc++.h>
using namespace std;
struct list
{
int data;
int next;
}node[100001];
int find(vector<vector<int> >&num,int x)
{
for(int i=0;i<num[0].size();i++)
{
if(abs(num[0][i])==x)return 0;
}
return 1;
}
int main()
{
vector<vector<int> >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<vector<int> >add1(2);
int n=0;
int head0=first;
if(node[head0].next==-1){printf("%05d %d -1\n",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<num1[0].size()-1;i++)
{
printf("%05d %d %05d\n",num1[1][i],num1[0][i],num1[1][i+1]);
}
if(i>=0&&i<num1[0].size())printf("%05d %d -1\n",num1[1][i],num1[0][i]);
for(i=0;i<add1[0].size()-1;i++)
{
printf("%05d %d %05d\n",add1[1][i],add1[0][i],add1[1][i+1]);
}
if(i>=0&&i<add1[0].size())printf("%05d %d -1\n",add1[1][i],add1[0][i]);
}