关键路径——Topsort算法(C++)

源代码:

#include<cstdio>
int m,n,h[1001]={0};
bool f[1001][1001]={0};
const int maxint=1061109567;
int main()
{
    scanf("%d%d",&n,&m);
    for (int a=1;a<=m;a++)
    {
      int x,y;
      scanf("%d%d",&x,&y);
      if (!f[x][y])
      {
        f[x][y]=true;
        h[y]++;
      }
    }
    for (int a=1;a<=n;a++)
    {
      int k(1);
      while ((h[k]!=0)&&(k<n))
        k++;
      for (int b=1;b<=n;b++)
        if (f[k][b])
          h[b]--;
      h[k]=maxint;
      printf("%d ",k);
    } //每次循环处理一个节点。
    return 0;
}

转载于:https://www.cnblogs.com/koruko/p/5115032.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
AOE网络(Activity On Edge Network)是一种用来描述工程项目的网络模型,其中每个节点表示一个活动,每条边表示活动之间的先后关系。关键路径是指在保证项目完成时间最短的前提下,所有活动中耗时最长的路径。以下是用C++实现关键路径的示例代码: ```c++ #include <iostream> #include <queue> #include <vector> using namespace std; const int MAXN = 10010; const int INF = 0x7fffffff; struct Edge { int to, w; Edge(int to, int w) : to(to), w(w) {} }; vector<Edge> G[MAXN]; // 存储图 int inDegree[MAXN]; // 存储入度 int earliest[MAXN]; // 存储最早开始时间 int latest[MAXN]; // 存储最晚开始时间 int n, m; // n为节点数,m为边数 void topsort() { queue<int> q; for (int i = 1; i <= n; ++i) { if (inDegree[i] == 0) { q.push(i); earliest[i] = 0; } } while (!q.empty()) { int u = q.front(); q.pop(); for (auto e : G[u]) { int v = e.to, w = e.w; inDegree[v]--; if (inDegree[v] == 0) { q.push(v); } earliest[v] = max(earliest[v], earliest[u] + w); } } } int criticalPath() { topsort(); int res = 0; for (int u = 1; u <= n; ++u) { for (auto e : G[u]) { int v = e.to, w = e.w; latest[u] = max(latest[u], latest[v] - w); } } for (int u = 1; u <= n; ++u) { for (auto e : G[u]) { int v = e.to, w = e.w; if (latest[v] - earliest[u] - w == 0) { res = max(res, latest[v]); } } } return res; } int main() { cin >> n >> m; for (int i = 1; i <= m; ++i) { int u, v, w; cin >> u >> v >> w; G[u].push_back(Edge(v, w)); inDegree[v]++; } cout << criticalPath() << endl; return 0; } ``` 在上述代码中,我们使用vector存储图,使用队列进行拓扑排序。在拓扑排序的过程中,我们计算每个节点的最早开始时间。之后,我们再次遍历图,计算每个节点的最晚开始时间,并且计算关键路径的长度。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值