Мой алгоритм для этого:
Вот моя реализация моей идеи
vector<vector<int> >list(10000); // Graph is represented as Adjacency list
void topological_sort()
{
int i,l,item,j;
k=0;
queue<int>q; // Queue
vector<int>:: iterator it;
for(i=1;i<=n;i++) // Pushing nodes those who have indegree=0
{
if(indegree[i]==0)
q.push(i);
}
l=q.size();
if(l==0)
{
flag=2; // means no sequence is possible
return;
}
while(q.empty()==0)
{
l=q.size();
if(l>1)
flag=1; // multiple sequence possible for sure but check whether this is fully possible or not
item=q.front();
q.pop();
ans[k++]=item;
for(it=list[item].begin();it!=list[item].end();it++)
{
j=*it;
indegree[j]--;
if(indegree[j]==0)
q.push(j);
}
}
if(k!=n)
flag=2; // no sequence is possible.
}
Этот алгоритм слишком медленный! или просто наивная реализация. Какие дальнейшие улучшения возможны для этого. или как я могу использовать топологическую сортировку с использованием DFS для этого?
Теорема:
Ориентированный граф имеет уникальную топологическую сортировку тогда и только тогда, когда он является ориентированной цепью.
Доказательство оставлено как упражнение для вас
Чтобы определить, имеет ли ориентированный граф уникальный топологический вид, все, что вам нужно сделать, это:
Ваш код, кажется, не следует этому простому подходу. (Поправьте меня, если я ошибаюсь!) Поэтому, вместо того, чтобы пытаться выяснить, верен ли ваш код или нет, я бы предложил просто использовать схему алгоритма, приведенную выше.
Других решений пока нет …