无向无权图见另一篇文章《python无向无权图结构》,这篇讲无向带权图,并且给出一个地铁线路例子。
# -*- coding: UTF-8 -*-
#!/usr/bin/python
#-----------------------------------------------------------------------
# python3.6
# wgraph.py
# 图的数据结构,以邻接表的方式存储结点
#-----------------------------------------------------------------------
import sys
import stdio
from instream import InStream
from outstream import OutStream
MAXL=99999
#-----------------------------------------------------------------------
#无向带权图
class WGraph:
#构造函数,从文件或命令行读取边
def __init__(self, filename=None, delimiter=None):
self._e = 0
self._adj = dict()
self.lpath = []
if filename is not None:
instream = InStream(filename)
while instream.hasNextLine():
line = instream.readLine()
names = line.split(delimiter)
if(len(names)>0): #防止无效的行
if(names[-1].isdigit()):
for i in range(1, len(names)-1):#最后一个元素表示边的权值
self.addEdge(names[0], names[i], names[-1])
else:
for i in range(1, len(names)):#最后一个元素不是数值表示无权图,默认权为1
self.addEdge(names[0], names[i], 1)
#
def addEdge(self, v, w, weight):
if not self.hasVertex(v): self._adj[v] = {}
if not self.hasVertex(w): self._adj[w] = {}
if not self.hasEdge(v, w):
self._e += 1
self._adj[v][w]=int(weight)
self._adj[w][v]=int(weight)
#
def adjacentTo(self, v):
return iter(self._adj[v])
#
def vertices(self):
return iter(self._adj)
#
def hasVertex(self, v):
return v in self._adj
#
def hasEdge(self, v, w):
return w in self._adj[v]
#
def countV(self):
return len(self._adj)
#
def countE(self):
return self._e
#
def degree(self, v):
return len(self._adj[v])
def print_path(self, l, o):
for x in l:
#prin