python无向带权图

无向无权图见另一篇文章《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
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值