问题描述
我想遍历一个图两次,然后来回返回向量中的路径,它对于较小的节点值可以正常工作,但是当节点数很大时,例如:1000000个具有星形图的节点。它的工作太慢。此函数返回结果:vector
struct Edge {
int32_t to;
bool used;
};
vector<int32_t>res;
vector< vector<Edge> > edge;
vector<bool> covered;
list<int32_t > chainlist;
void edgeuse(int node,int neighbour) {
for (auto & i : edge[node]) {
if (i.to == neighbour) {
i.used = true;
}
}
}
void BFS(int start)
{
stack<int32_t>dstack;
dstack.push(start);
vector<int32_t> wherefrom;
wherefrom.resize(edge.size(),-1);
while (!dstack.empty())
{
int next= dstack.top();
dstack.pop();
for(unsigned i=0;i<edge[next].size();i++)
{
if(!edge[next][i].used)
{
if (wherefrom[edge[next][i].to] == -1) {
wherefrom[edge[next][i].to] = next;
}
dstack.push(edge [next][i].to);
if (edge [next][i].to == start) {
auto iter = find(chainlist.begin(),chainlist.end(),start);
iter++;
int node = wherefrom[start];
covered[start] = true;
edgeuse(start,node);
while (node != start) {
covered[node] = true;
chainlist.insert(iter,node);
edgeuse(node,wherefrom[node]);
node = wherefrom[node];
}
chainlist.insert(iter,node);
return;
}
}
}
}
wherefrom.clear();
}
int next()
{
for(unsigned int i=0;i<edge.size();i++)
{
if(covered[i]) {
for (unsigned int j = 0; j < edge[i].size(); j++) {
if (!edge[i][j].used) {
return i;
}
}
}
}
return -1;
}
void add_Edge(int s,int d)
{
edge[s].push_back({d,false});
edge[d].push_back({s,false});
}
template <typename Iterator>
vector<int32_t>plan(Iterator corridors_begin,Iterator corridors_end,size_t N)
{
edge.resize(N);
covered.resize(N,false);
for(auto i=corridors_begin;i!=corridors_end;i++){
add_Edge(i->from - 1,i->to - 1);
}
chainlist.push_back(0);
int startnode = 0;
do {
BFS(startnode);
for (auto i = chainlist.begin(); i != chainlist.end(); i++) {
}
startnode = next();
} while (startnode != -1);
res.clear();
res.resize(chainlist.size());
int index = 0;
for (auto i = chainlist.begin(); i != chainlist.end(); i++,index++) {
res[index] = *i + 1;
}
edge.clear();
covered.clear();
chainlist.clear();
return res;
}
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)