求调用链路的数目 和最大的耗时

/*
小明做为新人接收到的第一个任务就是去梳理所有的依赖关系,小明和每个系统的负责人确认了依赖关系,记录下调用对应系统的耗时,用这些数据分析端到端链路的数目和链路上最长的耗时。 
输入: 小明搜集到的系统耗时和依赖列表
 5  4   // 表示有5个系统和 4个依赖关系
 3      // 调用1号系统耗时 3 ms
 2      // 调用2号系统耗时 2 ms
 10     // 调用3号系统耗时 10 ms
 5      // 调用4号系统耗时 5 ms
 7      //  调用5号系统耗时 7 ms
 1 2    //  2号系统依赖1号系统
 1 3    //  3号系统依赖1号系统
 2 5    //  2号系统依赖5号系统
 4 5    //  4号系统依赖5号系统
输出: 调用链路的数目 和最大的耗时, 这里有三条链路1->2->5,1->3, 4->5,最大的耗时是1到3的链路 3+10 = 13,无需考虑环形依赖的存在。 
3 13
*/
#include"stdafx.h"
#include<iostream>
#include<stdio.h>
#include<string>
#include<string.h>
#include<unordered_set>
using namespace std;
struct Node {
    int v;//边的终点标号
    int w;//权值
    Node() {}
    Node(int a, int b) {
        v = a;
        w = b;
    }
};
const int N = 1000;
vector<Node> Adj[N];
vector<int> ans;
int value[N];
int num = 0;//链路数
bool start[N] = { false };
int n, m;//n为系统,m为依赖
int Maxcost=0;//最大花费时间
void DFS(int u,int cost) {//u为当前访问的顶点,cost为花费时间
    ans.push_back(u);
    if (Adj[u].size() == 0)
    {
        for (int j = 0;j < ans.size();j++) {
            cout << ans[j] << " ";
        }
        cout << endl;
        num++;
        if (cost >= Maxcost) {
            Maxcost = cost;
        }
        ans.pop_back();
    }
    else {
        for (int i = 0;i < Adj[u].size();i++) {
                    int v = Adj[u][i].v;
                    int w = Adj[u][i].w;
                    DFS(v, cost+w);
                    
        }ans.pop_back();
    }
    
    
}
void DFSTrave(int n) {
    for (int u = 1;u <= n;u++) {
        if (start[u-1] == false)
            DFS(u, value[u]);
    }
}
int main() {
    Node node ;
    int u1, u2;

    cin >> n >> m;//n个顶点,m个依赖关系
    for (int i = 1;i <= n;i++) {
            cin >> value[i];
    }
    for (int i = 0;i < m;i++) {
        cin >> u1>>u2;
        start[u2 - 1] = true;  //非头结点为true
        node=Node(u2, value[u2]);
        Adj[u1].push_back(node);
    }
    DFSTrave(n);
    cout <<num<<"  "<< Maxcost;
    return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值