阿里在线测评解析

题干:

今天我们看到的阿里巴巴提供的任何一项服务后边都有着无数子系统和组件的支撑,子系统之间也互相依赖关联,

其中任意一个环节出现问题都可能对上游链路产生影响。小明做为新人接收到的第一个任务就是去梳理所有的依赖关系,

小明和每个系统的负责人确认了依赖关系,记录下调用对应系统的耗时,用这些数据分析端到端链路的数目和链路上最长的耗时。

输入: 小明搜集到的系统耗时和依赖列表

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

思路:

一个很不错的题目,不过能在半个小时内做出来还是有点小难度的,主要是用到了一个深搜的思路,将所有依赖关系存在一个map中,从头节点开始向下搜索,有点链表的意思。

每搜到一个尾节点就将结果加1;

代码:

#include <iostream>
#include <map>
#include <algorithm>
#include <vector>
#include <stdlib.h>
#include <string.h>
using namespace std;
vector <int > timeUse;
vector <int > path;
multimap <int ,int > dependency;
bool head[100000+5];
int maxTime = 0,Time = 0;
int res = 0;
void findPath(int point) {
    multimap <int ,int >::iterator iter;
    path.push_back(point);
    Time += timeUse[point];
    iter = dependency.find(point);
    if(iter != dependency.end()) {
        int num = dependency.count(point);
        while(num--) {
            findPath(iter->second);
            iter++;
        }
    } else {
        res++;
        maxTime = max(maxTime,Time);
    }
    Time -= timeUse[point];
    path.pop_back();
}
int main() {
    int sysNum, dependList;
    while(cin >> sysNum >> dependList) {
        timeUse.clear();
        dependency.clear();
        path.clear();
        maxTime = 0,res = 0;
        memset(head,1,100005);
        timeUse.push_back(0);
        for(int i = 1; i <= sysNum; i++){
            cin >> Time;
            timeUse.push_back(Time);
        }

        for(int i = 1; i <= dependList; i++)
        {
            int sysLeader, sysFollower;
            cin >> sysLeader >> sysFollower;
            dependency.insert(make_pair(sysLeader,sysFollower));
            head[sysFollower] = 0;
        }
        for(int i = 1; i <= sysNum; i++)
            if(head[i]) {
                Time = 0;
                findPath(i);
            }
        cout << res << " " << maxTime << endl;
    }
    return 0;

}
/*
5 4
3 2 10 5 7
1 2
1 3
2 5
4 5
*/

 

转载于:https://www.cnblogs.com/GHzcx/p/9409446.html

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值