31 #pragma omp parallel for schedule(dynamic)
32 for (
int solverId = 0; solverId < numSolvers; solverId++)
56 std::vector<int> &leftId2ConnectedSubgraphId,
57 int &numConnectedSubgraphs,
int maxThreadNum)
59 std::vector<std::vector<int>> inv_adjList;
63 for (
unsigned int j = 0; j <
adjList[
i].size(); j++)
65 unsigned int v =
adjList[
i][j].first;
66 assert(v < inv_adjList.size());
67 inv_adjList[v].push_back(
i);
71 numConnectedSubgraphs = 0;
72 for (
unsigned int leftNodeId = 0; leftNodeId <
adjList.size(); leftNodeId++)
74 if (leftId2ConnectedSubgraphId[leftNodeId] >= 0)
76 int curNode = leftNodeId;
79 memset(reachedRight, 0,
sizeof(reachedRight));
80 std::queue<int> leftNodeInQ;
81 leftNodeInQ.push(curNode);
82 leftId2ConnectedSubgraphId[curNode] = numConnectedSubgraphs %
maxThreadNum;
83 while (leftNodeInQ.size())
85 curNode = leftNodeInQ.front();
87 for (
auto tmpPair :
adjList[curNode])
89 int rightNode = tmpPair.first;
90 if (reachedRight[rightNode])
92 reachedRight[rightNode] = 1;
93 for (
int nextLeftId : inv_adjList[rightNode])
95 if (leftId2ConnectedSubgraphId[nextLeftId] < 0)
97 leftId2ConnectedSubgraphId[nextLeftId] = numConnectedSubgraphs %
maxThreadNum;
98 leftNodeInQ.push(nextLeftId);
104 numConnectedSubgraphs++;