基本思想:
注意遍历方式;
关键点:
注意一下节点的前后地址输出问题;
#include<iostream> #include<stdlib.h> #include<stdio.h> #include<vector> #include<string> #include<math.h> #include<algorithm> #include<cstring> #include<map> #include<queue> #include<set> #include<stack> using namespace std; int n,st; struct node { int stp; int etp; int data; }; const int maxn = 100000; node vec[maxn]; set<int>sset; vector<node>ol; vector<node>tl; int main() { cin >> st >> n; int s, e, data; for (int i = 0; i < n; i++) { cin >> s >> data >> e; vec[s].stp = s; vec[s].etp = e; vec[s].data = data; } //int la=st; while (st != -1) { if (sset.find(abs(vec[st].data)) != sset.end()) { //如果找到; tl.push_back(vec[st]); st = vec[st].etp; } else { sset.insert(abs(vec[st].data)); ol.push_back(vec[st]); st = vec[st].etp; } } //st = ol[0].stp; for (int i = 0; i < ol.size(); i++) { if (i != ol.size() - 1) { printf("%05d %d %05d\n", ol[i].stp, ol[i].data, ol[i+1].stp); // st = ol[i+1].stp; } else { printf("%05d %d -1\n", ol[i].stp, ol[i].data); } } if (tl.size() == 0) { return 0; } //st = tl[0].stp; for (int i = 0; i < tl.size(); i++) { if (i != tl.size() - 1) { printf("%05d %d %05d\n",tl[i].stp, tl[i].data, tl[i+1].stp); //st = tl[i+1].stp; } else { printf("%05d %d -1\n", tl[i].stp, tl[i].data); } } return 0; }