python - 求图的最小度
问题描述
我正在尝试找到图形的度数分布。我尝试了以下代码:
class Vertex:
def __init__(self, key):
self.id = key
self.connectedTo = {}
def addNeighbor(self, nbr, weight=0):
self.connectedTo[nbr] = weight
def __str__(self):
degree = len([x.id for x in self.connectedTo])
return str(self.id) + ' connectedTo: ' + str([x.id for x in self.connectedTo]) + ' with degree ' + str(
len([x.id for x in self.connectedTo])), degree
def getConnections(self):
return self.connectedTo.keys()
def getId(self):
return self.id
def getWeight(self, nbr):
return self.connectedTo[nbr]
class Graph:
def __init__(self):
self.vertList = {}
self.numVertices = 0
def addVertex(self, key):
self.numVertices = self.numVertices + 1
newVertex = Vertex(key)
self.vertList[key] = newVertex
return newVertex
def getVertex(self, n):
if n in self.vertList:
return self.vertList[n]
else:
return None
def __contains__(self, n):
return n in self.vertList
def addEdge(self, f, t, weight=0):
if f not in self.vertList:
nv = self.addVertex(f)
if t not in self.vertList:
nv = self.addVertex(t)
self.vertList[f].addNeighbor(self.vertList[t], weight)
def removeEdge(self, f, t):
# return self.vertList[f].pop(t)
del self.vertList[f][t]
def getVertices(self):
return self.vertList.keys()
def removeVertices(self, f):
del self.vertList[f]
def __iter__(self):
return iter(self.vertList.values())
n = int(input())
g = Graph()
for i in range(n):
command = input().split(' ')
if command[0] == 'IV':
g.addVertex(command[1])
if command[0] == 'IA':
g.addEdge(command[2], command[1])
if command[0] == 'RV':
g.removeVertices(command[1])
if command[0] == 'RA':
g.removeEdge(command[2], command[1])
for v in g:
for w in v.getConnections():
print(f'( {v.getId()} , {w.getId()} )')
print(g.getVertices())
degrees = [v.__str__()[1] for v in g]
print(degrees)
if len(degrees) > 1:
print(min(degrees))
我的输入是这样的:
9
IV A
IV B
IV C
IA B C
IV D
IV E
IV F
IA E D
IA E F
我的输出是这样的:
( C , B )
( D , E )
( F , E )
图的度数是其顶点度数的最大值,但我试图实现相反的想法,即它是顶点度数的最小值。任何人都可以在不使用 NetworkX 的情况下帮助我吗?
我试图继续使用这个逻辑,但我无法使用已经预定义的类来实现:
graph = {"A": [],
"B": [],
"C": ["B"],
"D": ["E"],
"E": [],
"F": ["E"]}
def max_length(x):
return len(graph[x])
# Determine what index has the longest value
index = max(graph, key=max_length)
m = len(graph[index])
# Fill the list with `m` zeroes
out = [0 for x in range(m + 1)]
for k in graph:
print(k)
l = len(graph[k])
out[l] += 1
print(out)
解决方案
感谢大家的评论。我想在更改程序逻辑并重做例程后,我设法实现了我的预期:
from collections import defaultdict
class Graph:
def __init__(self):
self._graph = defaultdict(set)
self._weight = dict()
def has_node(self, n):
return n in self._graph
def nodes(self):
return iter(self._graph)
def node_count(self):
return len(self._graph)
def neighbours(self, n):
return iter(self._graph[n])
def neighbour_count(self, n):
return len(self._graph[n])
def add_node(self, n):
"""Add the node n."""
self._graph[n]
def remove_node(self, n):
for n1 in self.neighbours(n):
if n1 != n:
self._graph[n1].remove(n)
del self._weight[self._edge(n, n1)]
del self._graph[n]
def _edge(self, n1, n2):
return (n1, n2) if n1 <= n2 else (n2, n1)
def has_edge(self, n1, n2):
return self._edge(n1, n2) in self._weight
def edges(self):
for n, w in self._weight.items():
yield n + (w,)
def edge_count(self):
return len(self._weight)
def edge_weight(self, n1, n2):
return self._weight[self._edge(n1, n2)]
def add_edge(self, n1, n2, w=0):
self._graph[n1].add(n2)
self._graph[n2].add(n1)
self._weight[self._edge(n1, n2)] = w
def remove_edge(self, n1, n2):
self._graph[n1].remove(n2)
if n1 != n2:
self._graph[n2].remove(n1)
del self._weight[self._edge(n1, n2)]
n = int(input())
if n != 0:
g = Graph()
for i in range(n):
command = input().split(' ')
if command[0] == 'IV':
g.add_node(command[1])
if command[0] == 'IA':
g.add_edge(command[2], command[1])
if command[0] == 'RV':
g.remove_node(command[1])
if command[0] == 'RA':
g.remove_edge(command[2], command[1])
keys = [i for i in g.nodes()]
degrees = [g.neighbour_count(i) for i in keys]
print(min(degrees))
else:
print(0)
推荐阅读
- oop - 如果公共属性打破了封装概念,它们为什么存在?
- javascript - javascript中的闭包函数和普通函数有什么区别?
- asciidoc - 如何在左上角生成 Asciidoctor 警告
- r - 如何匹配R中两列之间的字符串?
- docker - AWS Lambda 内存泄漏中的硒?
- java - 数组列表
as = new ArrayList(Arrays.asList("India","Australia","South Africa")); - docker - 如何在 docker 中运行简单的 minikube?
- apache-spark - 如何启动 Cassandra 和 Spark 服务,为每个程序分配一半的 RAM 内存?
- python - django 显示 500 错误而不是 403 错误
- python - sklearn pipeline() 是否将 X 和 y 都提供给以下步骤?