22分代码:
#include <bits/stdc++.h>
#define debug(x) cout<<#x<<":"<<x<<endl;
#define f(i,a,n) for(int i=a;i<n;++i)
#define ff(i,a,n) for(int i=a;i<=n;++i)
const int INF=0x3f3f3f3f;
using namespace std;
typedef long long ll;
//
const int N=1e5+5;
struct node{
int st,data,ed;
}a[N],b[N];
int start,n;
vector<int> v;
int main(){
cin>>start>>n;
f(i,0,n){
int t;cin>>t;
a[t].st=t;
cin>>a[t].data>>a[t].ed;
}
f(i,0,n){
b[i].st= (!i) ?start:b[i-1].ed;
b[i].data=a[b[i].st].data;
b[i].ed=a[b[i].st].ed;
}
int num=n,p1=0,p2=n-1;
while(num>0){
if(num>0){
v.push_back(b[p2].st);
v.push_back(b[p2].data);
v.push_back(b[p1].st);
}
num--;p2--;
if(num>0){
v.push_back(b[p1].st);
v.push_back(b[p1].data);
v.push_back(b[p2].st);
}
num--;p1++;
}
f(i,0,v.size()){
if(i!=v.size()-3)
printf("%05d %d %05d\n",v[i],v[i+1],v[i+2]);
else
printf("%05d %d -1\n",v[i],v[i+1]);
i+=2;
}
return 0;
}
错误原因:
有多余节点,需要想办法先构建出整个链表,采用链式前向星
ac代码:
#include <bits/stdc++.h>
#define f(i,a,b) for(int i=a;i<b;i++)
#define ff(i,a,b) for(int i=a;i<=b;i++)
#define debug(x) cout<<#x<<" : "<<x<<endl;
using namespace std;
//
const int N=1e5+5;
int e[N],ne[N],dat[N],h[N],idx=0;
int st,n;
int order[N],num=0;
void add(int x,int y,int da){
dat[x]=da;
if(y!=-1)
e[idx]=y,ne[idx]=h[x],h[x]=idx++;
}
int main(){
memset(h,-1,sizeof h);
cin>>st>>n;
f(i,0,n){
int x,da,y;
cin>>x>>da>>y;
add(x,y,da);
}
order[num++]=st;
for(int i=h[st];~i;i=h[e[i]]){
order[num++]=e[i];
}
int i=0,j=num-1;
while(i<j){
printf("%05d %d %05d\n",order[j],dat[order[j]],order[i]);
if(i+1!=j)
printf("%05d %d %05d\n",order[i],dat[order[i]],order[j-1]);
else
printf("%05d %d %d\n",order[i],dat[order[i]],-1);
i++,j--;
}
if(i==j)
printf("%05d %d %d\n",order[i],dat[order[i]],-1);
}
更简洁的写法(借鉴博客:1165 Block Reversing):
#include <bits/stdc++.h>
#define debug(x) cout<<#x<<":"<<x<<endl;
#define f(i,a,n) for(int i=a;i<n;++i)
#define ff(i,a,n) for(int i=a;i<=n;++i)
const int INF=0x3f3f3f3f;
using namespace std;
typedef long long ll;
//
using namespace std;
const int N = 100010;
int n;
int h, e[N], ne[N];
int main(){
scanf("%d%d", &h, &n);
for (int i = 0; i < n; i ++ ){
int adr, data, next;
scanf("%d%d%d", &adr, &data, &next);
e[adr] = data, ne[adr] = next;
}
vector<int> q,q2;
for (int i = h; ~i; i = ne[i]) q.push_back(i);
while (1){
if(!q.size())break;
q2.push_back(q[q.size()-1]);q.erase(q.end()-1);
if(!q.size())break;
q2.push_back(q[0]);q.erase(q.begin());
}
for (int i = 0; i < q2.size(); i ++ ){
printf("%05d %d ", q2[i], e[q2[i]]);
if (i + 1 == q2.size()) puts("-1");
else printf("%05d\n", q2[i + 1]);
}
return 0;
}