hmm, vc trabalha com isso ou eh coisa de faculdade?! queria trabalhar fazendo sistemas desse tipo hehe vou fazer para vc porque gosto desse tipo de problema.
É uma solução generica que deve funcionar para qualquer… o que pode abaixar a performasse eh o fato de uma tarefa ser dependente da tarefa X e Y sendo que a X eh dependente da Y (como no caso do 2 que eh dependente de 3 e 4 e 3 eh dependente de 4).
Tenta entender o que eu fiz, pelos meus testes está funcionado, se vc não entende alguma coisa, me add no msn [email removido] que eu te explico hj anoite (depois das 21h que eh qdo eu vou estar em casa).
Isso ae 
package lubs;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
public class Teste
{
public static final int INF = Integer.MAX_VALUE;
static class Tarefa
{
public int id;
public List<Tarefa> dep;
public int tempo;
public int tempoTotal;
public Tarefa (int id, int tempo)
{
this.id = id;
this.tempo = tempo;
this.tempoTotal = INF;
this.dep = new ArrayList<Tarefa>();
}
public Tarefa addDep(Tarefa t)
{
dep.add(t);
return this;
}
public void acertaTempo()
{
int tempoDep = 0;
Set<Tarefa> analisadas = new HashSet<Tarefa>();
for (Tarefa t : dep)
{
if (analisadas.contains(t)) continue;
if (t.tempoTotal == INF)
{
tempoTotal = INF;
return;
}
analisadas.addAll(dependentes(t));
tempoDep = Math.max(tempoDep, t.tempoTotal);
}
tempoTotal = tempo + tempoDep;
}
private Set<Tarefa> dependentes(Tarefa t)
{
Set<Tarefa> setDep = new HashSet<Tarefa>();
setDep.add(t);
for (Tarefa dep : t.dep)
{
setDep.addAll(dependentes(dep));
}
return setDep;
}
}
public static void main(String[] args)
{
// cria as tarefas
Tarefa t1 = new Tarefa(1, 3);
Tarefa t2 = new Tarefa(2, 5);
Tarefa t3 = new Tarefa(3, 6);
Tarefa t4 = new Tarefa(4, 2);
Tarefa t5 = new Tarefa(5, 9);
// adiciona as dependencias
t1.addDep(t2).addDep(t4);
t2.addDep(t3).addDep(t4).addDep(t5);
t3.addDep(t4);
// coloca numa lista
List<Tarefa> tarefas = new ArrayList<Tarefa>();
tarefas.add(t1);
tarefas.add(t2);
tarefas.add(t3);
tarefas.add(t4);
tarefas.add(t5);
// aqui que começa a logica para valer
boolean processa = true;
while (processa)
{
processa = false;
for (Tarefa t : tarefas)
{
if (t.tempoTotal == INF) t.acertaTempo();
if (t.tempoTotal == INF) processa = true;
}
}
int max = 0;
for (Tarefa t : tarefas)
{
max = Math.max(max, t.tempoTotal);
System.out.println("Tarefa " + t.id + " levara " + t.tempoTotal + " semanas para acabar");
}
System.out.println("Total do projeto: " + max + " semanas.");
}
}
e sim, eu deixei tudo public, mas isso vc ajusta neh
valeu!
Ah, e eu não fiz qq tratamento para detectar loopings do tipo 1 eh dependente de 5 e 5 eh dependente de 1, ou 1 eh dependente de 3 que eh dependente de 5 que eh dependente de 1. O certo eh ter essa validação e não deixar incluir como dependente a tarefa Y de uma tarefa X, se existe direta ou indiretamente. uma dependencia de X para Y.