8

私は次のように説明されているUdacityの問題を解決しようとしています:

# Find Eulerian Tour
#
# Write a function that takes in a graph
# represented as a list of tuples
# and return a list of nodes that
# you would follow on an Eulerian Tour
#
# For example, if the input graph was
# [(1, 2), (2, 3), (3, 1)]
# A possible Eulerian tour would be [1, 2, 3, 1]

私は次の解決策を思いつきました。これは、いくつかの再帰的アルゴリズムほど洗練されていませんが、私のテストケース内では機能するようです。

def find_eulerian_tour(graph):
    tour = []

    start_vertex = graph[0][0]
    tour.append(start_vertex)

    while len(graph) > 0:
        current_vertex = tour[len(tour) - 1]
        for edge in graph:
            if current_vertex in edge:
                if edge[0] == current_vertex:
                    current_vertex = edge[1]
                elif edge[1] == current_vertex:
                    current_vertex = edge[0]
                else:
                    # Edit to account for case no tour is possible
                    return False

                graph.remove(edge)
                tour.append(current_vertex)
                break
    return tour

graph = [(1, 2), (2, 3), (3, 1)]
print find_eulerian_tour(graph)

>> [1, 2, 3, 1]

ただし、これを提出すると、採点者に拒否されます。私は何か間違ったことをしていますか?エラーが表示されません。

4

10 に答える 10

8

アルゴリズムが失敗する有効なケースは次のとおりです。

graph = [(1, 2), (2, 3), (3, 1), (3, 4), (4, 3)]

の力を使用して、とprintに何が起こるかを調べます。graphcurrent_vertex

別のヒント:ループが壊れていないときに実行されるelseように、下に移動します。今のところ、実行することはできません。もちろん、その修正後もアルゴリズムは失敗します。forfor

もちろん、アルゴリズムはまだ失敗します。

もちろん、アルゴリズムはまだ失敗します。

コードが機能しないとコメントしないでください。そうではありません。以下のコードがOPが念頭に置いていたことを実行したとしても、アルゴリズムは失敗します。重要なのは、OPのアルゴリズムが間違っていることを示すことでしたが、OPはそれを判別できませんでした。そのためには、OPのアルゴリズムの正しい実装が必要です(以下を参照)。間違ったアルゴリズムを正しく実装しても、それでも正しい解決策ではありません。

これらの長い説明をすべて書くことによってこの答えを悪化させて申し訳ありませんが、人々はコードが機能しないと不平を言い続けています(もちろん、ポイントはそれが間違っていることを示すことでした)。彼らはまた、おそらく解決策としてコードをコピーできることを期待しているため、この答えに反対票を投じています。しかし、これは重要ではありません。重要なのは、OPに彼のアルゴリズムにエラーがあることを示すことです。

以下のコードでは、オイラーツアーは見つかりません。あなたのアセスメントを渡すためのコードをコピーするために他の場所を探してください!

def find_eulerian_tour(graph):
    tour = []

    current_vertex = graph[0][0]
    tour.append(current_vertex)

    while len(graph) > 0:
        print(graph, current_vertex)
        for edge in graph:
            if current_vertex in edge:
                if edge[0] == current_vertex:
                    current_vertex = edge[1]
                else:
                    current_vertex = edge[0]

                graph.remove(edge)
                tour.append(current_vertex)
                break
        else:
            # Edit to account for case no tour is possible
            return False
    return tour

graph = [(1, 2), (2, 3), (3, 1), (3, 4), (4, 3)]
print(find_eulerian_tour(graph))

出力:

[(1, 2), (2, 3), (3, 1), (3, 4), (4, 3)] 1
[(2, 3), (3, 1), (3, 4), (4, 3)] 2
[(3, 1), (3, 4), (4, 3)] 3
[(3, 4), (4, 3)] 1
False
于 2012-09-17T11:12:47.200 に答える
4

私も同じ講義に参加していますが、WolframHの答えはうまくいきません。これが私の解決策です(採点者に受け入れられました):

next node可能な限りすべてをheap( )にプッシュsearchし、記録中にそれぞれを検索します。

def next_node(edge, current):
    return edge[0] if current == edge[1] else edge[1]

def remove_edge(raw_list, discard):
    return [item for item in raw_list if item != discard]

def find_eulerian_tour(graph):
    search = [[[], graph[0][0], graph]]
    while search:
        path, node, unexplore = search.pop()
        path += [node]

        if not unexplore:
            return path

        for edge in unexplore:
            if node in edge:
                search += [[path, next_node(edge, node), remove_edge(unexplore, edge)]]

if __name__ == '__main__':
    graph = [(1, 2), (2, 3), (3, 1), (3, 4), (4, 3)]
    print find_eulerian_tour(graph)

[1、3、4、3、2、1]

于 2016-07-15T23:56:06.210 に答える
2

アルゴリズムで処理できない場合は次のとおりです。4つの頂点の完全グラフ。print tourそこに固執すると、次のようになります。

>>> cg4 = [(0, 1), (0, 2), (0, 3), (1, 2), (1, 3), (2, 3)]
>>> find_eulerian_tour(cg4)
[0]
[0, 1]
[0, 1, 2]
[0, 1, 2, 0]
[0, 1, 2, 0, 3]
[0, 1, 2, 0, 3, 1]
[0, 1, 2, 0, 3, 1]
[0, 1, 2, 0, 3, 1]
[etc.]

私はあなたのアプローチの問題を見つけるためにあなたに任せます-あなたは完全な実装を簡単にグーグルで検索することができます、それであなたはそうしなかったので、あなたがあなた自身のためにそれを理解する楽しみが欲しいと思います。:^)

編集:

うーん。私はそれが最初は単に失敗したケースであると思ったことを認めます。とにかく、@ WolframHは更新された例に私を打ち負かしましたが、コードが与える5つの頂点の完全グラフを見ることができます

[0, 1, 2, 0, 3, 1, 4, 0]

エッジ(2,3)、(2,4)、および(3,4)を見逃します。

于 2012-09-16T15:36:21.457 に答える
2

単純な再帰を使用すると、上記の解決策よりも簡単に問題を解決できます。

def find_eulerian_tour(graph):
    tour=[]
    find_tour(graph[0][0],graph,tour)
    return tour
def find_tour(u,E,tour): 
  for (a,b) in E:
    if a==u:
        E.remove((a,b))
        find_tour(b,E,tour)
    elif b==u:
        E.remove((a,b))
        find_tour(a,E,tour)
  tour.insert(0,u)

このコードは、タプルの任意の入力リストに対して機能し、ツアーのリストを返します。plsは、提案や変更がある場合はそれを送信します。ありがとう@WolframH:グラフにループが存在し、コードを失敗させるためだけにタプルが入力されている場合、コードは機能しません。

于 2013-11-08T18:47:12.330 に答える
2

私はUdacityで同じコースを受講していました。そして、ウィキペディアから読んだ後、Hierholzerのアルゴリズムを実装しました。アルゴリズムへのリンクは次のとおりですhttps://en.wikipedia.org/wiki/Eulerian_path

そして、以下は私のコードです。間違いなく、それは採点者によって受け入れられました(Python3からPython2への変更を行った後)。:)

#!/usr/bin/env python3
# Find Eulerian Tour
#
# Write a program that takes in a graph
# represented as a list of tuples
# and return a list of nodes that
# you would follow on an Eulerian Tour
#
# For example, if the input graph was
# [(1, 2), (2, 3), (3, 1)]
# A possible Eulerian tour would be [1, 2, 3, 1]

def get_a_tour():
    '''This function returns a possible tour in the current graph and removes the edges included in that tour, from the graph.'''
    global graph

    nodes_degree = {}       # Creating a {node: degree} dictionary for current graph.
    for edge in graph:
        a, b = edge[0], edge[1]
        nodes_degree[a] = nodes_degree.get(a, 0) + 1
        nodes_degree[b] = nodes_degree.get(b, 0) + 1

    tour =[]        # Finding a tour in the current graph.
    loop = enumerate(nodes_degree)
    while True:
        try:
            l = loop.__next__()
            index = l[0]
            node = l[1]
            degree = nodes_degree[node]
            try:
                if (tour[-1], node) in graph or (node, tour[-1]) in graph:
                    tour.append(node)
                    try:
                        graph.remove((tour[-2], tour[-1]))
                        nodes_degree[tour[-1]] -= 1     # Updating degree of nodes in the graph, not required but for the sake of completeness.
                        nodes_degree[tour[-2]] -= 1     # Can also be used to check the correctness of program. In the end all degrees must zero.
                    except ValueError:
                        graph.remove((tour[-1], tour[-2]))
                        nodes_degree[tour[-1]] -= 1
                        nodes_degree[tour[-2]] -= 1
            except IndexError:
                tour.append(node)
        except StopIteration:
            loop = enumerate(nodes_degree)

        if len(tour) > 2:
            if tour[0] == tour[-1]:
                return tour

def get_eulerian_tour():
    '''This function returns a Eulerian Tour for the input graph.'''
    global graph
    tour = get_a_tour()

    if graph:   # If stuck at the beginning, finding additional tour in the graph.
        loop = enumerate(tour[: -1])
        l = loop.__next__()
        i = l[0]
        node = l[1]
        try:
            while True:
                if node in list(zip(*graph))[0] or node in list(zip(*graph))[1]:
                    t = get_a_tour()    # Retreivng the additional tour
                    j = t.index(node)
                    tour = tour[ : i] + t[j:-1] + t[ :j+1] + tour[i+1: ]        # Joining the two tours.
                    if not graph:       # Found Eulerian Tour
                        return tour     # Returning the Eulerian Tour
                    loop = enumerate(tour[: -1])        # Still stuck? Looping back to search for another tour.
                l = loop.__next__()
                i = l[0]
                node = l[1]
        except StopIteration:   # Oops! seems like the vertices in the current tour cannot connect to rest of the edges in the graph.
            print("Your graph doesn't seem to be connected")
            exit()
    else:       # Found the Eulerian Tour in the very first call. Lucky Enough!
        return tour

# Sample inputs
# graph = [(1, 2), (1, 3), (2, 3), (2, 4), (2, 6), (3, 4), (3, 5), (4, 5), (4, 6)]
# graph = [(1, 2), (1, 3), (2, 3)]
# graph = [(1, 2), (1, 3), (2, 3), (2, 4), (2, 6), (3, 4), (3, 5), (4, 5), (4, 6), (9, 10), (10, 11), (11, 9)]
# graph = [(1, 2), (1, 3), (2, 3), (2, 4), (2, 6), (3, 4), (3, 5), (4, 5), (4, 6), (2, 7), (7, 8), (8, 2)]
# graph = [(1, 2), (1, 3), (2, 3), (2, 4), (2, 6), (3, 4), (3, 5), (4, 5), (4, 6), (1, 5), (5, 6), (1, 6)]
# graph = [(1, 2), (2, 3), (3, 1), (3, 4), (4, 3)]
# graph = [(0, 1), (0, 2), (0, 3), (1, 2), (1, 3), (2, 3)]
# graph = [(2, 6), (4, 2), (5, 4), (6, 5), (6, 8), (7, 9), (8, 7), (9, 6)]

# creating a {node: degree} dictionary
nodes_degree = {}
for edge in graph:
    a, b = edge[0], edge[1]
    nodes_degree[a] = nodes_degree.get(a, 0) + 1
    nodes_degree[b] = nodes_degree.get(b, 0) + 1

#checking degree
degrees = nodes_degree.values() # remember it return a view
for degree in degrees:
    if degree % 2:
        print("Your graph have one or more nodes with odd degrees. Hence an Eulerian Tour is impossible.")
        exit()

#finding Eulerian Tour
tour = get_eulerian_tour()
print(tour)

お役に立てれば。

于 2015-07-30T15:51:28.430 に答える
1

これがGregorUlmのWebページの元のコードであり、機能します。

def find_eulerian_tour(graph):

def freqencies():
    # save all nodes of edges to my_list
    # e.g. [3,4,5,1,2,2,3,5]
    my_list = [x for (x, y) in graph]
    # get the max num of nodes-->create a list
    # set all to 0
    # for i in range(5) = 0 1 2 3 4
    # so range("5" +1) means
    # len=6, result=[0,0,0,0,0,0]
    # so that the index = the number itself
    result = [0 for i in range(max(my_list) + 1)]
    # nodes in my_list, increment
    # e.g. [0,1,2,2,1,2] 
    # 3appears 2times.
    for i in my_list:
        result[i] += 1
    return result
    # this is Frequencies of each nodes.

def find_node(tour):
    for i in tour:
        if freq[i] != 0:
            return i
    return -1

def helper(tour, next):
    find_path(tour, next)
    u = find_node(tour)
    while sum(freq) != 0:     
        sub = find_path([], u)
        # get the sub_path
        # add them together
        # when draw to u, turn to sub, and then come back to go on the original tour path
        # [:a], start to a; [a+1:] a+1 to end
        tour = tour[:tour.index(u)] + sub + tour[tour.index(u) + 1:]  
        u = find_node(tour)
    return tour

def find_path(tour, next):
    for (x, y) in graph:
        if x == next:
            # from "double-graph"
            # pop out the current one and its respondent one
            # actually it means we delete this edge
            current = graph.pop(graph.index((x,y)))
            graph.pop(graph.index((current[1], current[0])))
            # now add this "next" node into the tour
            tour.append(current[0])
            # decrement in frequency
            freq[current[0]] -= 1
            freq[current[1]] -= 1
            return find_path(tour, current[1])
    # if this "next" node is not connected to any other nodes
    # single one
    tour.append(next)
    return tour             

# in graph, all edges get reversed one and be added to graph
# can call it "double-graph"  
# it helps to calculate the frequency in find_path
# actually we can regard frequency as degrees for each node       
graph += [(y, x) for (x, y) in graph]
freq = freqencies()   
# set graph[0][0] as starting point
return helper([], graph[0][0])

graph = [(1, 2), (2, 3), (3, 1)]
print find_eulerian_tour(graph)
于 2017-01-07T21:40:56.403 に答える
0

コードは無向グラフでは失敗しますが、有向グラフでは完全に実行されます。ただし、Udacity側からはまだ問題を解決できませんが、同じものの下位バージョンとして扱うことができます。私はまだこの言語に慣れていないので、ひどく使用されているPythonを気にしないでください。


かなり良いレベルの複雑さの2つのテストシナリオが下部に追加されました。


initialNode = ''
nglength = 0
in_graphLength = 0
normalizedGraph = list()
path = []
node_dict = {}
mod_flag = ''
  
def find_eulerian_tour(graph):
    global in_graphLength
    in_graphLength = len(graph)
    graph = normalize_graph(graph,[],-1,len(graph))
    print (path)
    return path
def normalize_graph(graph,nG,remNode,length):
    counter = 0
    global path
    global initialNode
    global in_graphLength
    global nglength
    global normalizedGraph
    localGraph = list()
    path = []
    pathList = []
    if(remNode != -1):
        normalizedGraph = nG
    baseNode = 0
    if(len(normalizedGraph) != 0):
        ini1, ini2 = normalizedGraph[0]
        initialNode = ini1
        a1,b1 = normalizedGraph[len(normalizedGraph) - 1]
        baseNode = b1
        if(remNode != -2):
            graph.pop(remNode)
    if(remNode == -1):
        a,b = graph[0]
        baseNode = b
        normalizedGraph.append(graph[0])
        initialNode = a
        nglength = 1
        graph.pop(0)
    i = 0
    if(len(graph) != 0):
        for n1, n2 in graph:
            i = i + 1
            if(n1 == baseNode):
                localGraph = graph[:]
                if(isJunction((n1,n2),localGraph, nglength)):
                    graph.pop(i-1)
                    graph.append((n1,n2))
                    normalize_graph(graph, normalizedGraph, -2,in_graphLength)
                    break
                else:
                    normalizedGraph.append((n1, n2))
                    nglength = nglength + 1
                    normalize_graph(graph, normalizedGraph, i - 1,in_graphLength)
                    break

    else:
        if( counter == 0):
            counter = counter + 1
            a0, b0 = normalizedGraph[0]
            for n1, n2 in normalizedGraph:
                path.append(n1)
            path.append(a0)
            path = path
            return path

def isJunction((n1,n2), graph, nglength):
    global node_dict
    count = 0
    if(len(graph) > 1):
        for a1, a2 in graph:
            if (n1 == a1):
                count = count + 1
        if (count > 1):
            if(str(n1) not in node_dict):
                key = str(n1)
                node_dict[key] = count
            else:
                return handle_degree(n1)
            return modification_needed((n1, n2), graph, nglength)
        else:
            return False
    else:
        return False

def handle_degree(n1):
    global node_dict
    key = str(n1)
    if(node_dict.get(key) == 2):
        return False

def modification_needed((n1,n2),graph, tmplength):
    i = 0
    global mod_flag
    if( n2 == initialNode):
        return True
    if(len(graph) > 1):
        for b1, b2 in graph:
            if(n2 == b1):
                i = i + 1
                tmplength = tmplength + 1
                if (b1,b2) in normalizedGraph:
                    mod_flag = True
                    continue
                if(tmplength < in_graphLength and b2 == initialNode):
                    mod_flag = True
                    continue
                else:
                    graph.pop(i-1)
                    modification_needed((b1,b2),graph,tmplength)
    return mod_flag


#find_eulerian_tour([(1,2),(2,6),(7,2),(6,1),(2,3),(3,5),(3,4),(4,5),(5,7),(7,3),(5,6),(6,7)])
#find_eulerian_tour([(0,4),(1,0),(4,2),(4,8),(2,5),(9,5),(8,9),(5,4),(5,1),(7,1),(3,7),(1,6),(6,3)])
于 2016-10-28T21:58:11.260 に答える
0

このソリューションは、 O(V + E)の複雑さ、つまりグラフ内のエッジと頂点の数が線形になるように最適化されています

コードを直接見たい人のために:https ://github.com/cubohan/py-algos/blob/master/eulerian_tour.py

コードは主に読みやすさとDRY設計に違反しますが、説明を読んだ後、自分のバージョンを簡単に解き放つことができることに注意してください。

# eulerian_tour.py by cubohan
# circa 2017
#
# Problem statement: Given a list of edges, output a list of vertices followed in an eulerian tour
#
# complexity analysis: O(E + V) LINEAR


def find_eulerian_tour(graph):
    edges = graph
    graph = {}
    degree = {}
    start = edges[0][0]
    count_e = 0
    for e in edges:
        if not e[0] in graph:
            graph[e[0]] = {}
        if not e[0] in degree:
            degree[e[0]] = 0
        if not e[1] in graph:
            graph[e[1]] = {}
        if not e[1] in degree:
            degree[e[1]] = 0
        graph[e[0]][e[1]] = 1
        graph[e[1]][e[0]] = 1
        degree[e[0]] += 1
        degree[e[1]] += 1
        count_e += 1
    max_d = 0
    this_ = 0
    for v, d in degree.items():
        if not d%2 == 0:
            # Eulerian tour not possible as odd degree found!
            return False 
        if d>max_d:
            this_ = v
            max_d = d
    visited_e = {}
    def is_visited(i, j):
        key = str(sorted([i,j]))
        if key in visited_e:
            return True
        else:
            visited_e[key] = True
            return False
    start = this_
    route = [start]
    indexof = {}
    indexof[start] = 0
    while count_e>0:
        flag = False
        for to_v in graph[this_]:
            if not is_visited(to_v, this_):
                route.append([to_v])
                indexof[to_v] = len(route)-1
                degree[to_v] -= 1
                if degree[to_v] == 0:
                    del degree[to_v]
                degree[this_] -= 1
                if degree[this_] == 0:
                    del degree[this_]
                this_ = to_v
                flag = True
                count_e -= 1
                break
        if not flag:
            break
    for key, v in degree.items():
        if v <=0:
            continue
        try:
            ind = indexof[key]
        except Exception as e:
            continue
        this_ = key
        while count_e>0:
            flag = False
            for to_v in graph[this_]:
                if not is_visited(to_v, this_):
                    route[ind].append(to_v)
                    degree[to_v] -= 1
                    degree[this_] -= 1
                    this_ = to_v
                    flag = True
                    count_e -= 1
                    break
            if not flag:
                break
    route_ref = []
    for r in route:
        if type(r) == list:
            for _r in r:
                route_ref.append(_r)
        else:
            route_ref.append(r)
    return route_ref

if __name__ == "__main__":
    print find_eulerian_tour([(0, 1), (1, 5), (1, 7), (4, 5),(4, 8), (1, 6), (3, 7), (5, 9),(2, 4), (0, 4), (2, 5), (3, 6), (8, 9)])

**まず、問題は次のサブタスクに分けることができます。**

  1. グラフをエッジのリストよりもわかりやすい構造に構築して、処理を容易にします。つまり、(隣接リスト)

  2. 各頂点の度数を見つけて、最初にオイラーツアーが可能かどうかを確認します(度数だけがありますか?また、後で使用するために、頂点をキーとしてdictにこれらの値を保存します=>)

  3. オイラーツアーを構築する

私のソリューションの背後にある概念は単純です。

  1. 開始点として最も高い次数を持つ頂点を選択し、それを現在の頂点として設定します。(注:これは、すべての頂点の度を計算するときに同時に実行します。これらの度はすべて辞書に保存します。)

  2. 答えであるルートリストに現在の頂点を挿入します(注:ルートリストに頂点とそのインデックスの辞書も作成します。これは後で使用されます)。

  3. 現在の頂点にまだアクセスしていない場合は、その最初のエッジにアクセスします。(注:訪問したエッジのディクショナリが維持されます。このdictのキーは、エッジを構成する頂点のペアのソートされたタプルです。エッジを訪問した後、それをdictに挿入して訪問済みとしてマークします。)

  4. 現在の頂点と訪問した頂点の残りの度数を維持します(これは後で役立ちます)(注:エッジを選択するたびに、生成する度数から1を引くだけで済みます)

  5. 現在の頂点を、アクセスすることを決定したエッジのもう一方の端の頂点に切り替えます。

  6. 現在の頂点に未訪問のエッジが見つからなくなるまで、手順2〜5を繰り返します。(注:これは、開始頂点に戻ったことを意味します)

ここで、これを考慮してください。未訪問のエッジ/頂点は、メイングラフと同じプロパティを持つメイングラフのサブグラフを構成することに注意してください。つまり、同じ頂点で開始および終了するサブグラフの任意の頂点からオイラーツアーが可能です。

したがって、これらのサブグラフでオイラーツアーに参加することで、すべての未訪問のエッジにアクセスできます。これらのサブツアーを最初のツアーとマージする必要があります。

次:

  1. グラフのすべての頂点をループし、この頂点の減少度がゼロ以外の場合にのみ、メインツアーにリストされているのと同じプロセスでサブツアーを作成します

  2. これらのツアーが以前に計算されたルートリストとマージされる方法は、ルートリスト内からサブツアーを開始することを検討している頂点の位置をサブツアー出力リストに置き換え、後でこのルートリストをフラット化することです。

まだ終わっていません!上記の何が問題になっていますか?

訪問されておらず、ルートリストに存在しないゼロ以外の頂点を取得するとどうなりますか?!

警告: これは例外的なケースです。

以前にアクセスしたことがない頂点に遭遇する可能性があるため、それらはメインルートリストに表示されません。

ループしながらこれらを無視してください!ゼロ以外の減少度で既にアクセスした頂点の1つは、それらから開始して作成するサブツアーでこれらの頂点につながることが保証されています。

そんなことがあるものか??!!

コードへのリンクに示されているテストケースからグラフを描くと、理解できます。プロセスのすべてのステップでアルゴが何をしているかを追跡します。それを描く!画像は、理解と単語O(n2)に対するlog(N)の複雑さです。

ああ、この保証は、入力リストのすべてのエッジが1つのグラフを形成し、2つの別々のばらばらのグラフを形成しない場合にのみ適用されることに注意してください。

于 2017-01-15T11:05:33.417 に答える
0

BFSアルゴリズムの動作を模倣し、それに便乗することができます。

注:リンクリストでは2つのクラスを定義する必要があるため(1つはノードとその動作を定義し、もう1つはリンクリスト全体とその動作を定義する)、リンクリストを使用して回答を記述しようとはしていません。ただし、(追加)および(削除)動作の効率を高めるには、配列の代わりにリンクリストを使用する必要があります。

def find_eulerian_tour(graph):
    nodes = set()

    for i in graph:
        if not i[0] in nodes:
            nodes.add(i[0])
        if not i[1] in nodes:
            nodes.add(i[1])

    tour = []
    tempstack = []
    graphtemp = []

    current_vertex = graph[0][0]
    tour.append(current_vertex)
    tempstack.append(current_vertex)
    last_edge = ()
    count = 0

    while len(set(tempstack)) + 1 < len(nodes) or (count == 0 or tour[0] != tour[len(tour) - 1]):
        count += 1
        flag = False
        for edge in graph:
           if current_vertex in edge and edge != last_edge:
                if current_vertex == edge[0]:
                    current_vertex = edge[1]
                else:
                    current_vertex = edge[0]
                last_edge = edge
                graphtemp.append(edge)
                graph.remove(edge)
                tour.append(current_vertex)
                tempstack.append(current_vertex)
                flag = True
                break

        if flag == False:
            tour.remove(current_vertex)
            current_vertex = tempstack[0]
            tempstack.remove(tempstack[0])
            graph.append(graphtemp[0])
            graphtemp.remove(graphtemp[0])


    return tour


print find_eulerian_tour([(1,2), (2,3), (3,1)])
print(find_eulerian_tour([(0, 1), (1, 5), (1, 7), (4, 5), (4, 8), (1, 6), (3, 7), (5, 9), (2, 4), (0, 4), (2, 5), (3, 6), (8, 9)]))
print(find_eulerian_tour([(1, 13), (1, 6), (6, 11), (3, 13), (8, 13), (0, 6), (8, 9),(5, 9), (2, 6), (6, 10), (7, 9), (1, 12), (4, 12), (5, 14), (0, 1),  (2, 3), (4, 11), (6, 9), (7, 14),  (10, 13)]))
print(find_eulerian_tour([(8, 16), (8, 18), (16, 17), (18, 19), (3, 17), (13, 17), (5, 13),(3, 4), (0, 18), (3, 14), (11, 14), (1, 8), (1, 9), (4, 12), (2, 19),(1, 10), (7, 9), (13, 15), (6, 12), (0, 1), (2, 11), (3, 18), (5, 6), (7, 15), (8, 13), (10, 17)]))
于 2017-07-17T08:27:18.277 に答える
0

これを行うとどうなりますか?(チェックしたところ、udacityテストに合格しました!!)

import itertools
def create_tour(alist):
    return list(itertools.permutations(alist,2))
于 2018-03-16T09:12:19.347 に答える