阿里在线测评解析
题干:
今天我们看到的阿里巴巴提供的任何一项服务后边都有着无数子系统和组件的支撑,子系统之间也互相依赖关联,
其中任意一个环节出现问题都可能对上游链路产生影响。小明做为新人接收到的第一个任务就是去梳理所有的依赖关系,
小明和每个系统的负责人确认了依赖关系,记录下调用对应系统的耗时,用这些数据分析端到端链路的数目和链路上最长的耗时。
输入: 小明搜集到的系统耗时和依赖列表
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 */
宝剑锋从磨砺出 梅花香自苦寒来