- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我已经用 C++ 编写了一个拓扑排序算法,但我不确定复杂度是否达到应有的水平。我知道有一种拓扑排序算法可以在 O(P+D) 时间内工作,其中 p 是项目,D 是依赖项的数量,但我不确定我是否正确编写了它。你能看看吗?代码如下。也欢迎任何其他改进建议,我觉得有 2 个相邻列表效率低下,我认为应该有更好的方法来做到这一点。
#include <iostream>
#include <string>
#include <unordered_map>
#include <unordered_set>
#include <queue>
using namespace std;
class Graph
{
public:
Graph(vector<string> projects, vector<pair<string,string>> dependencies)
{
int counter=0;
for(int i=0;i< projects.size();i++)
{
strToInt[projects[i]]=counter++;
}
adjList.resize(projects.size());
for(int i=0;i<dependencies.size();i++)
{
adjList[strToInt[dependencies[i].second]].first.insert(strToInt[dependencies[i].first]);
adjList[strToInt[dependencies[i].first]].second.push_back(strToInt[dependencies[i].second]);
}
}
vector<pair<unordered_set<int>,vector<int>>> adjList;
unordered_map<string,int> strToInt;
bool BuildOrder(){
vector<int> visited(adjList.size(),0);
queue<int> q;
int count =0;
for(int i=0;i<adjList.size();i++)
{
if(adjList[i].first.size()==0)
{
count++;
q.push(i);
}
}
while(!q.empty())
{
count++;
int temp=q.front();
q.pop();
visited[temp]=1;
for(int i=0;i<adjList[temp].second.size();i++)
{
adjList[i].first.erase(temp);
if(adjList[i].first.size()==0&&visited[i]==0)
{
q.push(i);
}
}
}
if(count==visited.size())
{
return true;
}
return false;
}
};
int main()
{
vector<string> projects {"a", "b", "c", "d", "e", "f"};
vector<pair<string,string>> dependencies{
{"a","d"},
{"f","b"},
{"b","d"},
{"f","a"},
{"d","c"}
};
Graph g(projects,dependencies);
bool temp=g.BuildOrder();
return 0;
}
最佳答案
我不完全理解您的代码在做什么,但我认为它正在实现 Kahn 的算法。 Kahn 算法的问题在于它需要一个图形表示,您可以在其中有效地获得有向图中给定顶点的近邻和外邻。对我来说,考虑到一种拓扑类型自然地脱离了仅对外邻的深度优先搜索,这使得它太麻烦了。
下面是DFS方式的一个实现。我用两个访问过的集合来做,就像他们在维基百科文章中解释的那样,因为这样你甚至不需要跟踪图的源顶点,在构建图时入度为零的顶点——尽管如果你知道基于 DFS 的算法的来源更简单。
#include <iostream>
#include <iterator>
#include <functional>
#include <algorithm>
#include <string>
#include <unordered_map>
#include <unordered_set>
#include <deque>
using Edges = std::vector<std::pair<std::string, std::string>>;
using Vertices = std::vector<std::string>;
using Graph = std::unordered_map<std::string, std::vector<std::string>>;
Graph BuildAjacencyList(const Edges& edges)
{
Graph graph;
for (const auto& edge : edges)
graph[edge.first].push_back(edge.second);
return graph;
}
Vertices FindTopologicalOrder(const Vertices& vertices, const Edges& edges)
{
auto graph = BuildAjacencyList(edges);
std::unordered_set<std::string> unexplored, visited;
std::copy(vertices.begin(), vertices.end(), std::inserter(unexplored, unexplored.end()));
std::deque<std::string> topo_order;
std::function<bool(std::string)> visit = [&](std::string vert) {
if (unexplored.find(vert) == unexplored.end())
return true;
if (visited.find(vert) != visited.end())
return false;
visited.insert(vert);
for (const auto& neighbor : graph[vert])
if (!visit(neighbor))
return false;
visited.erase(vert);
unexplored.erase(vert);
topo_order.push_front(vert);
return true;
};
while (!unexplored.empty())
if (!visit(*unexplored.begin()))
return Vertices(); // the dependency graph has a cycle.
return Vertices(topo_order.begin(), topo_order.end());
}
int main()
{
std::vector<std::string> projects{ "a", "b", "c", "d", "e", "f" };
Edges dependencies{
{"a","d"},
{"f","b"},
{"b","d"},
{"f","a"},
{"d","c"},
{"b","e"}
};
auto order = FindTopologicalOrder(projects, dependencies);
if (order.empty()) {
std::cout << "there is a cycle in these dependencies\n";
} else {
for (const auto& vert : order)
std::cout << vert << std::endl;
}
return 0;
}
关于c++ - 这个拓扑排序算法的复杂度是 O(P+D),其中 P 是项目,D 是依赖关系?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57261465/
我在 gobject 上阅读了一个维基百科页面,上面写着, Depending only on GLib and libc, GObject is a cornerstone of GNOME and
如何注册一个依赖属性,其值是使用另一个依赖属性的值计算的? 由于 .NET 属性包装器在运行时被 WPF 绕过,因此不应在 getter 和 setter 中包含逻辑。解决方案通常是使用 Proper
我一直在尝试将 ActionbarSherlock maven 依赖项添加到我的项目中 com.actionbarsherlock library 4.2.0 在我的 po
http://tutorials.jenkov.com/ood/understanding-dependencies.html#whatis说(强调我的): Whenever a class A us
我对所有这些魔法有点不清楚。 据我了解,依赖属性是从 DependencyObject 继承的,因此存储值: 如果分配了值(在本地字典中),则在实例本身中 或者如果未指定值,则从指向父元素的链接中获取
我刚刚更新了在 ASP.NET Framework 4.5.2 版上运行的 MVC Web 应用程序。我正在使用 Twilio 发送 SMS 消息: var twilio = new TwilioRe
我刚刚发现了一件令人生畏的事情。 spring 依赖坐标有两个版本。 项目依赖于 spring mvc 和 spring flow。有两组并行的依赖项。 Spring MVC 具有以下方案的依赖项
我正在尝试包含 的 maven 依赖项 org.jacorb jacorb 2.3.1 依赖已解决,但它导致另一个依赖 picocontainer 出现问题: [ERROR
我正在尝试在 Haskell 项目中包含特定版本的库。该库是住宿加早餐型的(用于 martix 操作),但我需要特定的 0.4.3 版本,该版本修复了乘法实现的错误。 所以,我的 stack.yaml
有谁知道如何制作依赖的 UIPickerView.例如,当我选择组件一的第 2 行时,组件二的标题会发生变化吗? 我在互联网上查找过,没有真正的答案,我尝试过使用 if 和 switch 语句,但它们
我正在编写一个用于验收测试的项目,由于各种原因,这依赖于另一个打包为 WAR 的项目。我已成功使用 maven-dependency-plugin 解压 WAR,但无法让我的项目包含解压的 WEB-I
或多或少我在 session 上大量构建我的网站(特别是重定向用户等),我很好奇这是否是一种危险的做法。禁用浏览器 cookie 保存的用户的大致比例是多少?我愿意接受任何建议:) 谢谢 最佳答案 s
开始玩 Scala futures,我被依赖的 futures 困住了。 让我们举个例子。我搜索地点并获得 Future[Seq[Place]]。对于这些地点中的每一个,我搜索最近的地铁站(该服务返回
或多或少我在 session 上大量构建我的网站(特别是重定向用户等),我很好奇这是否是一种危险的做法。禁用浏览器 cookie 保存的用户的大致比例是多少?我愿意接受任何建议:) 谢谢 最佳答案 s
我有一个二进制文件,需要一些 *.so 文件才能执行。现在,当我尝试在一些旧机器上执行它时,它会显示 /lib/libc.so.6: version `GLIBC_2.4' not found 如何将
我尝试使用 Dygraph 来表示图表,我在 https://github.com/danvk/dygraphs 中找到了代码,但是它有太多的依赖文件,我觉得很烦人。是否有一个文件可以容纳所有必需的
我正在处理一个 javascript 文件,该文件 a) 声明一个具有函数的对象,并且 b) 使用它期望在外部声明的散列调用该对象的 init 函数。我的 Jasmine 规范提示它找不到哈希,因为它
最近我一直在学习 Angular 并且进展顺利,但是关于依赖注入(inject)的一些事情我仍然不清楚。 是否有任何理由在我的 app.js 文件中声明我的应用程序的其他部分(服务、 Controll
考虑一个名为 foo 的表,它有 id (PRIMARY & AUTO_INCREMENT) 列。我正在向该表中插入一行,挑战从此时开始。 $db->query("INSERT INTO `foo`
我正在使用级联下拉 jquery 插件。 (https://github.com/dnasir/jquery-cascading-dropdown) 我有两个下拉菜单。 “客户端”和“站点”。 根据您
我是一名优秀的程序员,十分优秀!