Lines Matching defs:Src

113     for (uint64_t Src = 0; Src < Nodes.size(); Src++) {
114 for (auto &Edge : Edges[Src]) {
117 if (Src == Source)
133 void addEdge(uint64_t Src, uint64_t Dst, int64_t Capacity, int64_t Cost) {
135 assert(Src != Dst && "loop edge are not supported");
145 DstEdge.Dst = Src;
149 DstEdge.RevEdgeIndex = Edges[Src].size();
151 Edges[Src].push_back(SrcEdge);
156 void addEdge(uint64_t Src, uint64_t Dst, int64_t Cost) {
157 addEdge(Src, Dst, INF, Cost);
162 std::vector<std::pair<uint64_t, int64_t>> getFlow(uint64_t Src) const {
164 for (const auto &Edge : Edges[Src]) {
172 int64_t getFlow(uint64_t Src, uint64_t Dst) const {
174 for (const auto &Edge : Edges[Src]) {
247 uint64_t Src = Queue.front();
249 Nodes[Src].Taken = false;
266 if (Nodes[Src].Distance > Nodes[Target].Distance)
270 for (uint64_t EdgeIdx = 0; EdgeIdx < Edges[Src].size(); EdgeIdx++) {
271 auto &Edge = Edges[Src][EdgeIdx];
274 int64_t NewDistance = Nodes[Src].Distance + Edge.Cost;
278 Nodes[Dst].ParentNode = Src;
385 for (size_t Src : AugmentingOrder) {
386 AugmentingEdges[Src].clear();
387 for (auto &Edge : Edges[Src]) {
389 if (Edge.OnShortestPath && Nodes[Src].Taken && Nodes[Dst].Taken &&
390 Nodes[Dst].Finish < Nodes[Src].Finish) {
391 AugmentingEdges[Src].push_back(&Edge);
394 assert((Src == Target || !AugmentingEdges[Src].empty()) &&
407 for (uint64_t Src : AugmentingOrder) {
408 Nodes[Src].FracFlow = 0;
409 Nodes[Src].IntFlow = 0;
410 for (auto &Edge : AugmentingEdges[Src]) {
418 for (uint64_t Src : AugmentingOrder) {
419 assert((Src == Target || Nodes[Src].FracFlow > 0.0) &&
421 // Distribute flow evenly among successors of Src
422 uint64_t Degree = AugmentingEdges[Src].size();
423 for (auto &Edge : AugmentingEdges[Src]) {
424 double EdgeFlow = Nodes[Src].FracFlow / Degree;
438 for (uint64_t Src : AugmentingOrder) {
439 if (Src == Target)
441 // Distribute flow evenly among successors of Src, rounding up to make
443 uint64_t Degree = AugmentingEdges[Src].size();
444 // We are guaranteeed that Node[Src].IntFlow <= SuccFlow * Degree
445 uint64_t SuccFlow = (Nodes[Src].IntFlow + Degree - 1) / Degree;
446 for (auto &Edge : AugmentingEdges[Src]) {
448 uint64_t EdgeFlow = std::min(Nodes[Src].IntFlow, SuccFlow);
451 Nodes[Src].IntFlow -= EdgeFlow;
459 // Because of rounding, not all flow can be sent along the edges of Src.
462 uint64_t Src = AugmentingOrder[Idx - 1];
465 for (auto &Edge : AugmentingEdges[Src]) {
471 Nodes[Src].IntFlow += EdgeFlow;
478 for (uint64_t Src : AugmentingOrder) {
480 assert(Src == Source || Nodes[Src].IntFlow == 0);
481 for (auto &Edge : AugmentingEdges[Src]) {
506 for (size_t Src = 0; Src < Nodes.size(); Src++) {
508 if (Nodes[Src].Distance > Nodes[Target].Distance)
511 for (auto &Edge : Edges[Src]) {
514 Src != Target && Dst != Source &&
516 Nodes[Dst].Distance == Nodes[Src].Distance + Edge.Cost &&
646 void findReachable(uint64_t Src, BitVector &Visited) {
647 if (Visited[Src])
650 Queue.push(Src);
651 Visited[Src] = true;
653 Src = Queue.front();
655 for (auto *Jump : Func.Blocks[Src].SuccJumps) {
699 uint64_t Src = Queue.begin()->second;
702 if (Src == Target ||
703 (Func.Blocks[Src].isExit() && Target == AnyExitBlock))
706 for (auto *Jump : Func.Blocks[Src].SuccJumps) {
709 if (Distance[Dst] > Distance[Src] + JumpDist) {
712 Distance[Dst] = Distance[Src] + JumpDist;
1300 uint64_t Src = Queue.front();
1302 for (uint64_t Dst : PositiveFlowEdges[Src]) {