题目:https://pintia.cn/problem-sets/994805342720868352/problems/994805369774129152
诶嘿嘿,自己写出来了,没有使用算法笔记的方法,而且感觉自己的方法更简单,其实就是用了一个vector数组,本来一开始想用queue的,后来发现好像没有必要了,而且没有数组方便,
- 唯一一个注意点,sort的范围是maxn,不要在validcount中排序
代码
#include<algorithm>#include<iostream>#include<vector>using namespace std;const int maxn = 100010;vector<bool> valid(10010, false);struct Node{int address, key, next;int order;bool flag;}node[maxn];vector<Node> v;bool cmp(Node a, Node b){if(a.flag == false || b.flag == false) return a.flag > b.flag;else return a.order < b.order;}int main(){for(int i = 0; i < maxn; i++){node[i].flag = false;node[i].order = maxn;}int first, n;scanf("%d%d", &first, &n);int address, key, next;for(int i = 0; i < n; i++){scanf("%d%d%d", &address, &key, &next);node[address].address = address;node[address].key = key;node[address].next = next;}int p = first, validcount = 0;while(p != -1){if(valid[abs(node[p].key)] == false){valid[abs(node[p].key)] = true;node[p].flag = true;node[p].order = validcount;validcount++;} else {v.push_back(node[p]);}p = node[p].next;}sort(node, node + maxn, cmp);for(int i = 0; i < validcount; i++){if(i != validcount - 1) printf("%05d %d %05d\n", node[i].address, node[i].key, node[i + 1].address);else printf("%05d %d -1\n", node[i].address, node[i].key);}for(int i = 0; i < v.size(); i++){if(i != v.size() - 1) printf("%05d %d %05d\n", v[i].address, v[i].key, v[i + 1].address);else printf("%05d %d -1\n", v[i].address, v[i].key);}return 0;}
