Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 基于某些数据使用节点和顶点构造图_Python_Python 3.x_Algorithm_Dictionary_Graph - Fatal编程技术网

Python 基于某些数据使用节点和顶点构造图

Python 基于某些数据使用节点和顶点构造图,python,python-3.x,algorithm,dictionary,graph,Python,Python 3.x,Algorithm,Dictionary,Graph,我正在研究由邻接表示给出的有向图。换句话说,图G将由一个字典来表示,该字典的键是顶点,其值是一个字典,该字典的键是顶点的邻域,其值可以指定为1。给定两个顶点u,v,在有向图G中,从u到v可能有一条边,但反之亦然。然而,两个方向都可能有一条边 我创建了一个名为reachable_vertices的函数,该函数将以图G和顶点v作为输入,并返回G中可以从v到达的所有顶点的列表。如果v可以到达顶点w,这意味着存在一个链v→ v1→ v2。。。→ w,其中链中的每个顶点到紧随其后的顶点都有一条边。顶点v不

我正在研究由邻接表示给出的有向图。换句话说,图G将由一个字典来表示,该字典的键是顶点,其值是一个字典,该字典的键是顶点的邻域,其值可以指定为1。给定两个顶点u,v,在有向图G中,从u到v可能有一条边,但反之亦然。然而,两个方向都可能有一条边

我创建了一个名为reachable_vertices的函数,该函数将以图G和顶点v作为输入,并返回G中可以从v到达的所有顶点的列表。如果v可以到达顶点w,这意味着存在一个链v→ v1→ v2。。。→ w,其中链中的每个顶点到紧随其后的顶点都有一条边。顶点v不必具有特定的类型,例如int或string,它可以是这两种类型中的任何一种,它只需要是表示图G的字典中的一个键

我定义了一个称为cfb_图的函数,它不带参数。我从文件cfb2010.csv(以下链接)中形成了一个有向图,将团队视为顶点,仅当团队1击败了团队2时,才在团队1和团队2之间创建一条边。 数据集链路=

cfb_图将返回给出此表示的字典

我能够找到以下问题,我将代码附在下面: 我奥本无法联系到哪些团队。将它们存储在列表中。 二,。从圣母院可以联系到哪些队伍。将它们存储在列表中。 iii.阿拉巴马州无法联系到哪些团队。将它们存储在列表中

我正在编写以下代码:

def reachable(G, v, setA): # This function checks if it's possible to reach w from v
    setA|={v}
    try:
        for w in set(G[v])-setA:reachable(G,w,setA)
    except KeyError:
        donothing = 0   
    return setA    
##   2a ##
def reachable_vertices(G, v):
    setA=set()
    setA|={v}
    try:
        for n in set(G[v])-setA:reachable(G,n,setA)
    except KeyError:
        donothing = 0    
    return setA    

def cfb_graph():
    svertex = []
    evertex = []
    count= 0
    file = open("cfb2010.csv","r")
    for line in file:  
        fields = line.split(",")
        if fields[5].replace("\n", "") == 'W':
            svertex.append(fields[1])
            evertex.append(fields[2])
        if count == 0:
            count = count +1


    graph = {}
    for i in range(len(svertex)):
        v = svertex[i]
        if v in graph:
            graph[v] |= set([evertex[i]])
        else:
            graph[v] = set([evertex[i]])    

    for key, value in graph.items():
          graph[key] =  dict.fromkeys(value,1) 
    return(graph)


######Part 2 c############
auburn_answer = list(set(cfb_graph().keys()).difference(set(reachable_vertices(cfb_graph(), "Auburn"))))
notre_dame_answer = reachable_vertices(cfb_graph(), "Notre Dame")
alabama_answer = list(set(cfb_graph().keys()).difference(set(reachable_vertices(cfb_graph(), "Alabama"))))
特别是对于每个顶点,我想返回一个字典,其中键是可到达的顶点,值如下所述。如果顶点w可以从顶点v到达,则存在从v到w的路径。在返回的字典中,对应于w的值将是在v到w的某个路径中紧跟在它前面的顶点。如果我使用队列方法,那么w的值将是while循环中的第一个顶点u,其中w是u的邻居


此外,我还想定义一个名为path的函数,它将以一个图G和两个顶点v和w作为输入。如果可以从v访问w,则它将返回一个顶点列表,其中第一个元素是v,最后一个元素是w,其他顶点是从v到w的路径上的顶点,按遍历顺序排列。如果没有路径,我应该返回None。我可能想使用上面定义的函数。

我想快速而强大的图形处理库将对您有很大帮助。它有大量不同的算法,因此您不能手动实现它,而只能在代码中使用函数调用

我构建了一个小工作流,它复制了您的所有功能并解决了您的问题:

# Imports
import networkx as nx
import csv

# Load CSV file and construct the directed graph
G = nx.DiGraph()
with open('cfb2010.csv', 'r') as f:
    sreader = csv.reader(f, delimiter=',')
    for line in sreader:
        if line[-1] != 'W':
            continue
        G.add_node(line[1])
        G.add_node(line[2])
        G.add_edge(line[1], line[2])

# Get all nodes
all_nodes = set(G.nodes())

# Get nodes that can be reached from the particular node
notredame_nodes = set(nx.bfs_tree(G, 'Notre Dame').nodes())
alabama_nodes = set(nx.bfs_tree(G, 'Alabama').nodes())
auburn_nodes = set(nx.bfs_tree(G, 'Auburn').nodes())

# Construct lists of nodes you need
print(all_nodes - alabama_nodes)
print(all_nodes - auburn_nodes)
print(notredame_nodes)
Networkx还有一个与您的函数相同的函数,称为路径函数:

print(nx.shortest_path(G, 'Florida', 'Illinois'))

['Florida', 'Penn St', 'Michigan', 'Illinois']


p.S.可到达节点构造使用。

这可能会有所帮助:您正在做(或试图做)的操作称为广度优先搜索(BFS),请参阅。在探索中,您通常存储父引用,这样可以有效地绘制链接任意一对节点的路径。我如何编程