weixin_41900139 2024-03-03 00:37 采纳率: 60%
浏览 19
已结题

补全networkx TODO部分。

import networkx as nx

class SecDepGraph:
def init(self):
self.graph = nx.DiGraph()

    # Map aliases to vertex names
    self.aliases = dict()

    # Map vertex names to flags (strings) that will be used when processing the graph

    # Map vertex names to auxiliary data for reporting etc. but not when processing the graph
    self.auxdata = dict()

    # Collection of edges to add in second pass
    self.cached_edges = set()

def add_vertex(self, vertexname, flags, auxdata=None):
    # TODO: check if vertex already exists or is an alias.  What to do in that case?
    
    # add the vertex

    # Always adding auxdata, but will be None if not passed in.
    self.auxdata[vertexname] = auxdata

def add_alias(self, vertexname, alias):
    # TODO: check if alias already exists or is a vertex.  What to do in that case?

    self.aliases[alias] = vertexname

def cache_edge(self, fromvertex, tovertex):
    '''Store an edge to be added later, after vertices and aliases are finalised.'''


def add_edge(self, fromvertex, tovertex):
    '''Add edge to the graph immediately.'''
    # check that both vertices exist or resolve aliases

    # add the edge

    pass

def finalise_edges(self):
    '''Add cached edges to the graph after all vertices and alias are finalised (stage 2).'''
    for (u,v) in self.cached_edges:
        self.add_edge(u, v)

    self.cached_edges = set()
  • 写回答

24条回答

  • 叫兽-郭老师 新星创作者: Java技术领域 2024-03-03 00:38
    关注

    🌈🌈🌈参考通义千问和郭老师的小迷弟雅思莫了-编写提供🌈🌈🌈
    您可以参考如下,如果回答的不正确,及时评论区回复我,我会根据你错误描述追加回复,直到您满意为止。

    SecDepGraph类中,你需要实现add_vertexadd_alias方法来检查是否已经存在同名的顶点或别名,并处理这些情况。以下是完成这些方法的代码:

    import networkx as nx
    
    class SecDepGraph:
        def __init__(self):
            self.graph = nx.DiGraph()
            self.aliases = dict()
            self.auxdata = dict()
            self.cached_edges = set()
    
        def add_vertex(self, vertexname, flags, auxdata=None):
            if vertexname in self.graph.nodes or vertexname in self.aliases.values():
                raise ValueError(f"Vertex '{vertexname}' already exists.")
            self.graph.add_node(vertexname)
            self.auxdata[vertexname] = auxdata or {}
    
        def add_alias(self, vertexname, alias):
            if alias in self.graph.nodes or alias in self.aliases:
                raise ValueError(f"Either vertex '{alias}' or alias already exists.")
            if vertexname not in self.graph.nodes:
                raise ValueError(f"Cannot create alias for non-existent vertex '{vertexname}'.")
            self.aliases[alias] = vertexname
    
        def cache_edge(self, fromvertex, tovertex):
            self.cached_edges.add((fromvertex, tovertex))
    
        def add_edge(self, fromvertex, tovertex):
            self._resolve_aliases(fromvertex, tovertex)
            self.graph.add_edge(fromvertex, tovertex)
    
        def _resolve_aliases(self, fromvertex, tovertex):
            if fromvertex in self.aliases:
                fromvertex = self.aliases[fromvertex]
            if tovertex in self.aliases:
                tovertex = self.aliases[tovertex]
            return fromvertex, tovertex
    
        def finalise_edges(self):
            for (u, v) in self.cached_edges:
                self.add_edge(u, v)
            self.cached_edges = set()
    

    在这个版本中,add_vertexadd_alias方法会检查新添加的顶点或别名是否已经存在,并抛出异常以避免冲突。add_edge方法使用_resolve_aliases辅助方法来解析别名并添加边。这应该满足你的需求。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(23条)

报告相同问题?

问题事件

  • 系统已结题 3月15日
  • 已采纳回答 3月7日
  • 创建了问题 3月3日