题意:给定一系列任务的依赖关系以及完成每个任务需要花费的时间,问一些任务的最晚完成时间和最早完成时间差值。
解法:根据依赖关系建立正反两个图,分别表示该任务动工之前需要完成哪些任务和哪些任务需要在该任务完成之后开始动工,然后两次dfs,分别标记任务,
然后剩下的没有标记的任务的就是完成时间就是所需要求的答案(具体见代码)。
#include <stdio.h>
#include <string.h>
#define N 505
bool g[N][N], gb[N][N], mk1[N], mk2[N];
int v[N];
void dfs1(int u, int n)
{
mk1[u] = 1;
for(int i = 1; i <= n; i++)
if(!mk1[i] && g[u][i])
dfs1(i, n);
}
void dfs2(int u, int n)
{
mk2[u] = 1;
for(int i = 1; i <= n; i++)
if(!mk2[i] && gb[u][i])
dfs2(i, n);
}
int main()
{
int n, m, a, b, cas = 1;
while(scanf("%d %d", &n, &m), n + m)
{
memset(g, 0, sizeof(g));
memset(gb, 0, sizeof(gb));
for(int i = 1; i <= n; i++)
scanf("%d", &v[i]);
for(int i = 0; i < m; i++)
{
scanf("%d %d", &a, &b);
g[a][b] = 1;
gb[b][a] = 1;
}
scanf("%d", &m);
printf("Case #%d:\n", cas++);
for(int i = 0; i < m; i++)
{
scanf("%d", &a);
memset(mk1, 0, sizeof(mk1));
memset(mk2, 0, sizeof(mk2));
dfs1(a, n);
dfs2(a, n);
int count = 0;
for(int j = 1; j <= n; j++)
{
if(!mk1[j] && !mk2[j])
{
count += v[j];
}
}
printf("%d\n", count);
}
puts("");
}
return 0;
}