/*
小明做为新人接收到的第一个任务就是去梳理所有的依赖关系,小明和每个系统的负责人确认了依赖关系,记录下调用对应系统的耗时,用这些数据分析端到端链路的数目和链路上最长的耗时。
输入: 小明搜集到的系统耗时和依赖列表
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;
}