2013-11-22 5 views
1

В ориентированном графе общая степень узла - это количество ребер, входящих в него, плюс количество ребер, выходящих из него. Дайте алгоритм линейного времени, который принимает в качестве входного ориентированного графа (в формате списка смежности, как всегда), и вычисляет общую степень каждого узла. Вывод алгоритма должен быть массивом total [.], С записью для каждого узла.подсчет общих степеней графа

это мой псевдо-код для этой проблемы:

procedure total degree(G) 
Input: Directed graph G=(V,E) 
Output: array total[.] with an entry for each node 

for all u in V in[u]=0 
for all u in V:  
    for all (u,v) in E: 
     in[v]=in[v]+1 

for all u in V out[u]=0 
for all u in V: 
    for all (u,v) in E: 
     out[u]=out[u]+1 

for all u in V total[u]=0 
for all u in V: 
    total[u]=in[v]+out[u] 
return total[u] 

может кто-то согласен я сделал это правильно или сказать мне, что я должен исправить, если я сделал ошибку, что им на самом деле не знаете о том, если я сделал outdegrees ([.] из) право

я использовал этот код в качестве опорной точки, чтобы придумать мой собственный:

function sources(G) 
Input: Directed graph G = (V;E) 
Output: A list of G's source nodes 
for all u in V : in[u] = 0 
for all u in V : 
    for all edges (u,w) in E: 
     in[w] = in[w] + 1 
L = empty linked list 
for all u in V : 
    if in[u] is 0: add u to L 
return L 
+0

Это правильно. =) – justhalf

+0

На самом деле нет внутреннего для цикла его всего лишь одного цикла, я просто написал его так, потому что так это делает моя книга. позвольте мне попытаться объяснить в блоке [.] for-loop псевдокода. Сначала алгоритм просматривает все узлы (| V |), которые я представляю как u, и назначает массив в [u], который подсчитывает все градусы (все направленные ребра, входящие в узел). он проходит через каждое ребро, начинающееся с u, и подсчитывает все числа в градусах, которые имеют u для каждого u, так как u - это просто переменная, представляющая узел – notamathwiz

ответ

2

Ваш второй для блока такой же, как и первый, единственный разность b eing имя массива. Это означает, что он будет считать те же края, что и первый, что дает неверный результат.

В вашей секунду, вам нужно подсчитать другого края, а не то же самое одно:

for all u in V out[u]=0 
for all u in V: 
    for all (u,v) in E: 
     out[v]=out[v]+1 

В качестве альтернативы, можно пересчитать их все на одном дыхании:

Предполагая, что вход G=(V,E) представляет собой список узлов (V) и список ребер (E), представленных парами узлов ((u, v)), и при условии, что дубликаты должны подсчитываться, все, что вам нужно сделать, - это подсчет узлов (оба и в) в списке краев.

for all u in V 
    total[u] = 0 

for all (u, v) in E 
    total[u] = total[u] + 1 
    total[v] = total[v] + 1 

return total 
+0

, чтобы ответить на ваш предыдущий вопрос: \t на самом деле нет внутреннего для цикла всего лишь один цикл, я просто написал это так, потому что это так делает моя книга. позвольте мне попытаться объяснить в блоке [.] for-loop псевдокода. Сначала алгоритм просматривает все узлы (| V |), которые я представляю как u, и назначает массив в [u], который подсчитывает все градусы (все направленные ребра, входящие в узел). он проходит через каждое ребро, начинающееся с u, и подсчитывает все градусы, которые имеют u для каждого u, так как u - это просто переменная, которая представляет собой узел – notamathwiz

+0

. Но тогда у вас есть внутренний, не так ли? Как вы можете подсчитывать ребра для каждого u, если вы не используете другой цикл внутри этого? – neeKo

+0

Я вижу вашу точку, и я добавил к коду, чтобы сделать его немного понятнее, также это просто псевдокод, что я имею в виду под этим кодом, так это то, что сначала для каждого ui создайте массив из [.], А затем для всех узлы u, i пересекаем этот список и отмечаем количество ребер, идущих или выходящих. ребро (u, w) просто представляет собой некоторый произвольный узел u (так как его переменная) и узел, который идет сразу после него (w), который составляет ребро (u, w). for-loop для части ребер является просто расширением цикла for для каждого узла u, его не является отдельным или внутренним for-loop – notamathwiz

Смежные вопросы