我正在尝试解决infoarena.ro上的问题(类似于codeforces.com的网站,但它是罗马尼亚语),并且出于某种原因,集合中的某些元素只是更改为随机值。相关代码:
#include <fstream>
#include <vector>
#include <algorithm>
using namespace std;
ofstream out("test.out");
ifstream in("test.in");
struct Edge
{
int from, to, color, index;
bool erased = false, visited = false;
};
struct Event;
int point(const Event* event);
struct Event
{
int time;
bool add;
Edge *edge;
bool operator < (const Event other) const
{
return (this->time < other.time) ||
(this->time == other.time && this->add < other.add) ||
(this->time == other.time && this->add < other.add &&
point(this)>point(&other));
}
};
int point(const Event* event)
{
if(event->edge->from == event->time)
return event->edge->to;
else
return event->edge->from;
}
vector<Edge> edges;
vector<Event> events;
int main()
{
int N, M;
in >> N >> M;
for(int i = 0; i < M; i++)
{
int x, y;
in >> x >> y;
if(x > y)
swap(x, y);
Edge e = {x, y, i, i};
edges.push_back(e);
events.push_back(Event{x, true, &edges.back()});
Edge debug = *events.back().edge;
events.push_back(Event{y, false, &edges.back()});
debug = *events.back().edge;
}
sort(events.begin(), events.end());
for(Event event : events)
out << event.edge->from << " " << event.edge->to << "\n";
return 0;
}
我排除了我写的与问题无关的代码。
输入: 5 6 1 2 2 5 1 4 3 1 4 3 5 3
第一行是N(顶点数)和M(边数)。下一行是所有边缘。
输出:
44935712 44896968
1 4
1 3
44935712 44896968
3 1941924608
1 3
3 4
3 5
1 4
3 4
3 1941924608
3 5
我正在努力制作一本&#34; journal&#34;就像我的老师所说的那样。对于每个边(x,y),我想在阶段x将其添加到堆栈中,并在阶段y(与堆栈中的所有其他元素一起擦除它直到我到达(x,y))。我想按时间排序&#34;当我进行这些操作时(因此&#34;时间&#34;在事件结构中的值)。 &#34;添加&#34;指示这是添加边缘还是从堆栈中删除边缘的事件。
我正在&#34;事件中输出边缘&#34;用于调试目的的向量,我注意到值变为随机的东西。有人可以解释为什么会这样吗?
答案 0 :(得分:5)
问题出在这里
events.push_back(Event{x, true, &edges.back()});
在这里
events.push_back(Event{y, false, &edges.back()});
当您将结构推入edges
向量时,向量将重新分配存储所包含结构所需的内存。如果发生这样的重定位,则向量中的所有迭代器 和指针 将变为无效。
一个简单的解决方案是将指针存储在edges
向量中,并复制Event
结构的指针。另一种可能的解决方案是做两次通过。一个创建edges
向量,然后单独传递(循环)以创建events
向量。