10 #include "../stdafx.h"
11 #include "../core/pool_func.hpp"
14 #include "../safeguards.h"
30 this->demand = demand;
56 for (NodeID node1 = 0; node1 < this->
Size(); ++node1) {
59 for (NodeID node2 = 0; node2 < this->
Size(); ++node2) {
67 void LinkGraph::Compress()
70 for (NodeID node1 = 0; node1 < this->
Size(); ++node1) {
71 this->
nodes[node1].supply /= 2;
72 for (NodeID node2 = 0; node2 < this->
Size(); ++node2) {
73 BaseEdge &edge = this->
edges[node1][node2];
74 if (edge.capacity > 0) {
75 uint new_capacity = std::max(1U, edge.capacity / 2);
76 if (edge.capacity < (1 << 16)) {
77 edge.travel_time_sum = edge.travel_time_sum * new_capacity / edge.capacity;
78 }
else if (edge.travel_time_sum != 0) {
79 edge.travel_time_sum = std::max(1ULL, edge.travel_time_sum / 2);
81 edge.capacity = new_capacity;
96 NodeID first = this->
Size();
97 for (NodeID node1 = 0; node1 < other->
Size(); ++node1) {
99 NodeID new_node = this->
AddNode(st);
103 for (NodeID node2 = 0; node2 < node1; ++node2) {
106 forward = other->
edges[node1][node2];
107 backward = other->
edges[node2][node1];
118 new_start = other->
edges[node1][node1];
130 assert(id < this->
Size());
132 NodeID last_node = this->
Size() - 1;
133 for (NodeID i = 0; i <= last_node; ++i) {
134 (*this)[i].RemoveEdge(
id);
138 while (next != INVALID_NODE) {
139 if (next == last_node) {
146 node_edges[id] = node_edges[last_node];
152 this->
nodes.pop_back();
171 NodeID new_node = this->
Size();
172 this->
nodes.emplace_back();
175 this->
edges.
Resize(new_node + 1U, std::max(new_node + 1U, this->
edges.Height()));
183 new_edges[new_node].
next_edge = INVALID_NODE;
185 for (NodeID i = 0; i <= new_node; ++i) {
187 this->
edges[i][new_node].Init();
202 assert(this->
index != to);
223 assert(capacity > 0);
224 assert(usage <= capacity);
225 if (this->
edges[to].capacity == 0) {
226 this->AddEdge(to, capacity, usage, travel_time, mode);
228 (*this)[to].Update(capacity, usage, travel_time, mode);
238 if (this->
index == to)
return;
246 NodeID prev = this->
index;
247 NodeID next = this->
edges[this->
index].next_edge;
248 while (next != INVALID_NODE) {
256 next = this->
edges[next].next_edge;
273 assert(this->edge.capacity > 0);
274 assert(capacity >= usage);
277 if (this->edge.travel_time_sum == 0) {
278 this->edge.travel_time_sum = (this->edge.capacity + capacity) * travel_time;
279 }
else if (travel_time == 0) {
280 this->edge.travel_time_sum += this->edge.travel_time_sum / this->edge.capacity * capacity;
282 this->edge.travel_time_sum += travel_time * capacity;
284 this->edge.capacity += capacity;
285 this->edge.usage += usage;
287 if (this->edge.travel_time_sum == 0) {
288 this->edge.capacity = std::max(this->edge.capacity, capacity);
289 this->edge.travel_time_sum = travel_time * this->edge.capacity;
290 }
else if (capacity > this->edge.capacity) {
291 this->edge.travel_time_sum = this->edge.travel_time_sum / this->edge.capacity * capacity;
292 this->edge.capacity = capacity;
294 this->edge.usage = std::max(this->edge.usage, usage);
307 assert(this->
Size() == 0);
309 this->
nodes.resize(size);
311 for (uint i = 0; i < size; ++i) {
312 this->
nodes[i].Init();
314 for (uint j = 0; j < size; ++j) column[j].
Init();