版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/mobius_strip/article/details/85246744
题目
有很多任务,需要不同的时间,任务之间有先后关系,计算最晚结束的任务的结束时间。
分析
拓扑排序,计算关键路径。数据较小,没有回边,这里直接用dfs更新即可。
说明
又是好久刷题了。。。
#include <iostream>
#include <cstdlib>
#include <sstream>
#include <string>
using namespace std;
int cost[27], est[27];
int maps[27][27];
void dfs(int u, int n)
{
for (int i = 0; i < n; ++ i)
if (maps[u][i] && est[i] < est[u] + cost[i]) {
est[i] = est[u] + cost[i];
dfs(i, n);
}
}
int main()
{
int T, V;
char C, nodes;
string buf;
cin >> T;
cin.get();
cin.get();
while (T --) {
for (int i = 0; i < 26; ++ i)
for (int j = 0; j < 26; ++ j)
maps[i][j] = 0;
int size = 0;
while (getline(cin, buf) && buf != "") {
stringstream s(buf);
s >> C >> V;
est[C - 'A'] = cost[C - 'A'] = V;
while (s >> nodes)
maps[nodes - 'A'][C - 'A'] = 1;
size ++;
}
for (int i = 0; i < size; ++ i)
dfs(i, size);
int ans = 0;
for (int i = 0; i < size; ++ i)
if (ans < est[i])
ans = est[i];
printf("%d\n", ans);
if (T) puts("");
}
return 0;
}