首页 > 其他分享 >18747 关键路径

18747 关键路径

时间:2024-10-13 14:20:54浏览次数:3  
标签:dist degree int 拓扑 路径 18747 edges 关键 节点

### 思路

1. **建模问题**:将项目的事件和活动建模为有向无环图(DAG),其中事件是节点,活动是有权值的边。
2. **选择算法**:使用拓扑排序算法来确定节点的处理顺序,然后在拓扑排序的基础上计算最长路径。
3. **初始化**:创建一个入度数组来记录每个节点的入度,并创建一个距离数组来记录从起点到每个节点的最长路径。
4. **拓扑排序**:使用队列进行拓扑排序,依次处理入度为0的节点,并更新其邻接节点的入度和距离。
5. **计算最长路径**:在拓扑排序的过程中,更新从起点到每个节点的最长路径,最终得到从起点到终点的最长路径。

### 伪代码

```
function find_longest_path(n, m, edges):
    create an array in_degree of size n+1, initialized to 0
    create a graph as an adjacency list of size n+1
    create an array dist of size n+1, initialized to -INF
    create a queue q

    for each (a, b, x) in edges:
        graph[a].append((b, x))
        in_degree[b] += 1

    dist[1] = 0
    for i from 1 to n:
        if in_degree[i] == 0:
            q.push(i)

    while q is not empty:
        u = q.pop()
        for each (v, w) in graph[u]:
            if dist[u] + w > dist[v]:
                dist[v] = dist[u] + w
            in_degree[v] -= 1
            if in_degree[v] == 0:
                q.push(v)

    return dist[n]
```

### C++代码

#include <iostream>
#include <vector>
#include <queue>

using namespace std;

struct Edge {
    int from;
    int to;
    int weight;
};

int find_longest_path(int n, int m, vector<Edge>& edges) {
    vector<int> in_degree(n + 1, 0);
    vector<vector<pair<int, int>>> graph(n + 1);
    vector<int> dist(n + 1, -1e9); // Use a very small value instead of INT_MIN
    queue<int> q;

    for (const auto& edge : edges) {
        graph[edge.from].emplace_back(edge.to, edge.weight);
        in_degree[edge.to] += 1;
    }

    dist[1] = 0;
    for (int i = 1; i <= n; ++i) {
        if (in_degree[i] == 0) {
            q.push(i);
        }
    }

    while (!q.empty()) {
        int u = q.front();
        q.pop();
        for (const auto& neighbor : graph[u]) {
            int v = neighbor.first;
            int w = neighbor.second;
            if (dist[u] + w > dist[v]) {
                dist[v] = dist[u] + w;
            }
            in_degree[v] -= 1;
            if (in_degree[v] == 0) {
                q.push(v);
            }
        }
    }

    return dist[n];
}

int main() {
    int n, m;
    cin >> n >> m;
    vector<Edge> edges(m);
    for (int i = 0; i < m; ++i) {
        cin >> edges[i].from >> edges[i].to >> edges[i].weight;
    }

    int result = find_longest_path(n, m, edges);
    cout << result << endl;

    return 0;
}

### 总结

1. **问题建模**:将项目的事件和活动建模为有向无环图,使用拓扑排序算法求解最长路径。
2. **算法选择**:使用拓扑排序算法,结合动态规划思想计算从起点到终点的最长路径。
3. **实现细节**:初始化入度数组和距离数组,使用队列进行拓扑排序,逐步更新节点的入度和距离。
4. **终止条件**:当队列为空时,输出从起点到终点的最长路径。

标签:dist,degree,int,拓扑,路径,18747,edges,关键,节点
From: https://blog.csdn.net/huang1xiao1sheng/article/details/142761644

相关文章

  • 如何判断是否是真实攻击 —— 网络安全的关键洞察
    在当今复杂的互联网环境中,准确判断一个告警IP是否为真实攻击,是保障网络安全的重要技能。这不仅关系到企业的信息资产安全,也影响着用户的隐私和数据安全。一、内网IP的判断流程当遇到告警IP为内网IP时,我们首先要深入剖析请求包内容。如今的网络攻击手段日益复杂,恶......
  • 【C语言基础】核心关键字详解与应用
    目录一、void1.1.作用1.2.代码示例二、基本数据类型(char、int、float、double等)2.1.char(字符类型)2.2.int(整型)2.3.float(单精度浮点型)2.4.double(双精度浮点型)2.5.代码示例三、控制流程语句(if、else、switch、case、default等)3.1.if和else语句3.2.switch......
  • 关于路径拼接测试脚本,测试加不加/
    importos#与操作系统交互模块importsys#与python解释器和运行环境相关的函数和变量importdjango#django框架模块#迭代版(无需更改,要保证此文件是:根目录/scripts/该脚本即可cwd=os.getcwd()#D:\d_pycharm_program\workshop_managerment\scriptsroot_path=......
  • 从入门到精通:几本关键书籍助你成为LLM大师
    以下是几本关于大模型和人工智能领域的经典书籍,它们各自具有独特的特点和适用人群:《深度学习》(DeepLearning)作者:伊恩·古德费洛(IanGoodfellow)、约书亚·本吉奥(YoshuaBengio)、亚伦·库维尔(AaronCourville)简介:《深度学习》是深度学习领域的经典之作,全面介绍了深度学习......
  • 地图瓦片详解:快速提升地图加载速度的关键技术
    地图瓦片(MapTiles)是指将一张完整的大型地图或影像切割成若干个小的矩形图块,每个图块(瓦片)代表地图的一部分。地图瓦片技术被广泛用于网络地图和地理信息系统(GIS)中,主要目的是为了提升地图的加载速度和用户体验,特别是在多级缩放和大规模数据处理的情况下。地图瓦片的基本概念地图......
  • Leetcode 1192. 查找集群内的关键连接
    1.题目基本信息1.1.题目描述力扣数据中心有n台服务器,分别按从0到n-1的方式进行了编号。它们之间以服务器到服务器的形式相互连接组成了一个内部集群,连接是无向的。用connections表示集群网络,connections[i]=[a,b]表示服务器a和b之间形成连接。任何服务器都可......
  • P4779 【模板】单源最短路径(标准版)
    堆优化版:通过定义一个最小堆来实现普通版本中的查找操作点击查看代码#include<iostream>#include<stack>#include<cmath>#include<algorithm>#include<set>#include<vector>#include<climits>#include<string.h>#include<map>#in......
  • 深入解析Spring AI框架:在Java应用中实现智能化交互的关键
    今天我们的SpringAI源码分析主题即将结束。我已经对自己感兴趣的基本内容进行了全面的审视,并将这些分析分享给大家。如果你对这个主题感兴趣,可以阅读以下几篇文章。每篇文章都层层递进,深入探讨相关内容。考虑到长文可能让大家感到疲惫,我采用了逐步推进的方式,确保每一篇都简明易懂......
  • 使用C#获取系统关键信息:CPU、内存、硬盘、用户与网络状态
    在C#中,获取系统信息如CPU、内存、硬盘、用户以及网络状态等,可以通过多种方式实现,包括使用System.Management命名空间中的类来查询WMI(WindowsManagementInstrumentation)信息,或者使用.NETFramework自带的类库。以下是一些基本示例来展示如何获取这些信息。1.引入必要的命......
  • java单例模式懒汉式 双重校验 关键字volatile
    Volatile关键字的作用Volatile关键字的作用主要有如下两个:1.线程的可见性:当一个线程修改一个共享变量时,另外一个线程能读到这个修改的值。2.顺序一致性:禁止指令重排序。不保证原子性一、线程可见性我们先通过一个例子来看看线程的可见性:publicclassVolatileTest{ ......