代码真的好烂啊。
一个元素加入之前,修改集合中(va,vb)最后一个元素的下一个地址为当前元素的地址。
然后我是把(元素地址,下一个地址)和(元素的值)拆开放到两个集合了,放一个里面有点麻烦不太会处理。
#include <bits/stdc++.h>
using namespace std;
int vis[10010];//是否已经来过
vector<pair<string, string>> va, vb;//va保留下来 vb删除掉的
vector<int> av, bv;
int main() {
string s;
int n;
cin >> s >> n;//s第一个节点的地址 n总共的节点数量
map<string, pair<string, int>> mp;//需要根据其实地址找到下一个地址
for (int i = 0; i < n; i++) {
string a, c;
int b;
cin >> a >> b >> c;
pair<string, int> pr;
pr.first = c;
pr.second = b;
mp[a] = pr;
}
vis[abs(mp[s].second)] = 1;
va.push_back(make_pair(s, "-1"));
av.push_back(mp[s].second);
string x = s;
while (mp[x].first != "-1") {
//处理父亲
pair<string, string> npr;//创建新节点
string parent = mp[x].first;
int parentv = mp[parent].second;
if (!vis[abs(parentv)]) {//没有出现过
pair<string, string> pr = va.back();//起始下一个
pr.second = parent;
va.pop_back();
va.push_back(pr);
npr.first = parent;
npr.second = "-1";
va.push_back(npr);
av.push_back(parentv);
vis[abs(parentv)] = 1;
}
else {
pair<string, string> pr;//起始下一个
if (!vb.empty()) {
pr = vb.back();
pr.second = parent;
vb.pop_back();
vb.push_back(pr);
npr.first = parent;
npr.second = "-1";
vb.push_back(npr);
bv.push_back(parentv);
}
else {
pr.first = parent;
pr.second = "-1";
vb.push_back(pr);
bv.push_back(parentv);
}
}
x = parent;
}
for (int i = 0; i < va.size(); i++) {
cout << va[i].first << " " << av[i] << " "<<va[i].second << endl;
}
for (int i = 0; i < vb.size(); i++) {
cout << vb[i].first << " " << bv[i] << " "<<vb[i].second << endl;
}
return 0;
}
标签:pr,va,vb,back,链表,002,second,L2,push
From: https://www.cnblogs.com/chengyiyuki/p/18072542