207. Course Schedule

There are a total of n courses you have to take, labeled from 0 to n - 1.

Some courses may have prerequisites, for example to take course 0 you have to first take course 1, which is expressed as a pair: [0,1]

Given the total number of courses and a list of prerequisite pairs, is it possible for you to finish all courses?

For example:

2, [[1,0]]

There are a total of 2 courses to take. To take course 1 you should have finished course 0. So it is possible.

2, [[1,0],[0,1]]

There are a total of 2 courses to take. To take course 1 you should have finished course 0, and to take course 0 you should also have finished course 1. So it is impossible.

Note:

  1. The input prerequisites is a graph represented by a list of edges, not adjacency matrices. Read more about how a graph is represented.
  2. You may assume that there are no duplicate edges in the input prerequisites.

click to show more hints.

Hints:
  1. This problem is equivalent to finding if a cycle exists in a directed graph. If a cycle exists, no topological ordering exists and therefore it will be impossible to take all courses.
  2. Topological Sort via DFS - A great video tutorial (21 minutes) on Coursera explaining the basic concepts of Topological Sort.

  1. Topological sort could also be done via BFS.
//1. BFS(Topological Sort)

bool canFinish(int numCourses, vector<vector<int>>& prerequisites)
{
    vector<unordered_set<int>> matrix(numCourses); // save this directed graph
    for(int i = 0; i < prerequisites.size(); ++ i)
        matrix[prerequisites[i][1]].insert(prerequisites[i][0]);
    
    vector<int> d(numCourses, 0); // in-degree
    for(int i = 0; i < numCourses; ++ i)
        for(auto it = matrix[i].begin(); it != matrix[i].end(); ++ it)
            ++ d[*it];
    
    for(int j = 0, i; j < numCourses; ++ j)
    {
        for(i = 0; i < numCourses && d[i] != 0; ++ i); // find a node whose in-degree is 0
        
        if(i == numCourses) // if not find
            return false;
        
        d[i] = -1;
        for(auto it = matrix[i].begin(); it != matrix[i].end(); ++ it)
            -- d[*it];
    }
    
    return true;
}
//2. DFS(Finding cycle)

bool canFinish(int numCourses, vector<vector<int>>& prerequisites)
{
    vector<unordered_set<int>> matrix(numCourses); // save this directed graph
    for(int i = 0; i < prerequisites.size(); ++ i)
        matrix[prerequisites[i][1]].insert(prerequisites[i][0]);
    
    unordered_set<int> visited;
    vector<bool> flag(numCourses, false);
    for(int i = 0; i < numCourses; ++ i)
        if(!flag[i])
            if(DFS(matrix, visited, i, flag))
                return false;
    return true;
}
bool DFS(vector<unordered_set<int>> &matrix, unordered_set<int> &visited, int b, vector<bool> &flag)
{
    flag[b] = true;
    visited.insert(b);
    for(auto it = matrix[b].begin(); it != matrix[b].end(); ++ it)
        if(visited.find(*it) != visited.end() || DFS(matrix, visited, *it, flag))
            return true;
    visited.erase(b);
    return false;
}


内容概要:本文详细介绍了水中有限长加肋圆柱壳体振动和声辐射的近似解析解,并提供了完整的Python实现。文中首先阐述了问题背景,即加肋圆柱壳体作为水下航行器的主要结构形式,肋骨的作用被简化为只有法向力。接着,通过一系列关键方程(如模态振动速度方程、壳体机械阻抗、特征矩阵元素等),推导出加肋圆柱壳体的振动和声辐射特性。Python代码部分实现了这些理论,包括定义`CylindricalShell`类来封装所有计算功能,如初始化参数、机械阻抗、辐射阻抗、肋骨阻抗、模态速度、辐射功率和辐射效率的计算。此外,还扩展了带刚性圆柱障板的圆柱壳体类`CylindricalShellWithBaffle`,并引入了集中力激励、简支边界条件和低频段计算的内容。最后,通过具体示例展示了如何创建壳体对象、设置参数、计算频率响应以及绘制结果图表,验证了加肋对辐射声功率和声辐射效率的影响。 适合人群:具备一定编程基础和声学基础知识的研究人员、工程师,特别是从事水下声学、船舶工程和振动分析领域的专业人员。 使用场景及目标:①通过代码实现和理论推导,深入理解加肋圆柱壳体的振动和声辐射特性;②分析肋骨对壳体声学性能的影响,优化结构设计;③利用Python代码进行数值模拟,评估不同参数配置下的声辐射效率和功率;④为实际工程项目提供理论支持和技术参考。 其他说明:本文不仅提供了详细的数学推导和Python代码实现,还讨论了实际应用中的注意事项,如参数调整、高频模态考虑、肋骨模型细化和数值稳定性处理。建议读者结合实际需求,灵活运用文中提供的理论和代码,进行更深入的研究和实践。
内容概要:本文详细介绍了使用Python实现灰狼优化算法(GWO)求解CEC2017测试函数的方法。首先,文章解释了GWO的基本概念,即通过模拟狼群的社会行为进行优化。接着,展示了如何安装必要的库并构建GWO的核心类,包括初始化参数、计算适应度以及优化过程中的关键步骤。文中还深入探讨了三个重要的细节:包围机制、随机扰动和位置融合,它们分别对应于算法的探索能力、防止陷入局部最优以及保持种群多样性。此外,作者提供了具体的代码实例,演示了GWO在不同测试函数上的应用,并讨论了针对特定问题的参数调整策略,如改变种群大小、迭代次数和衰减方式等。最后,给出了实用建议,帮助读者更好地理解和应用这一算法。 适合人群:对优化算法感兴趣的科研人员、研究生以及有一定编程基础的数据科学家。 使用场景及目标:适用于解决复杂的连续优化问题,特别是那些具有多个局部极值点的情况。通过学习本文,读者能够掌握GWO的工作原理及其Python实现方法,从而将其应用于各种工程和技术领域的优化任务中。 其他说明:文中提到的一些技巧,如非线性的a衰减策略、改进的位置更新公式和特殊的边界处理方法,对于提高算法性能至关重要。同时,作者强调了在面对不同类型的问题时灵活调整参数的重要性。
内容概要:本文提出了一种基于校准信息传输的实时跨平台神经视频编解码器。针对现有神经视频编解码器在跨平台应用时因浮点运算误差导致解码错误的问题,作者设计了一套校准传输系统,确保编码和解码端的一致性。具体方法包括:1) 通过传输少量校准信息来修正跨平台计算不一致;2) 利用分段高斯约束减少校准信息传输量;3) 引入模型剪枝、运动降采样和算术编码跳过等加速技术,使模型能够在消费级GPU上实现实时解码(约25FPS)。实验结果表明,该方法不仅解决了跨平台解码问题,而且在性能上优于传统H.265编解码器。 适合人群:对视频编解码技术有一定了解的研究人员和技术开发者,特别是关注神经网络编解码器在实际应用中遇到的挑战和解决方案的人群。 使用场景及目标:1) 解决跨平台编解码器因浮点运算误差导致的解码失败问题;2) 实现高效、实时的视频编解码,适用于消费级硬件设备;3) 提供一种无需额外训练即可实现跨平台一致性的新方法,适用于各类视频压缩算法。 其他说明:本文的方法理论上适用于所有使用熵模型和算术编码进行实际传输的编解码方法,有助于加速现有压缩方法的实施。然而,当跨平台计算误差较大时,校准信息的传输量也会显著增加,从而影响率失真性能。未来的工作将进一步优化和推广该方法的实际应用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值