python无向无权图结构

图的python代码,无向无权图

#-----------------------------------------------------------------------
# graph.py
# 图的数据结构,以邻接表的方式存储结点
#-----------------------------------------------------------------------

import sys
import stdio
from instream import InStream    #标准输入或文件输入统一类

#-----------------------------------------------------------------------

class Graph:

    # 构造函数,通过按边方式构造图,文件每行形如"a1 a2"添加结点,边上的两个结点默认用空格字符作为分隔符
    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)
                for i in range(1, len(names)):
                    self.addEdge(names[0], names[i])
                
    # 通过按边添加结点的方式构造图
    def addEdge(self, v, w):
        if not self.hasVertex(v): self._adj[v] = set()
        if not self.hasVertex(w): self._adj[w] = set()
        if not self.hasEdge(v, w):
            self._e += 1
            self._adj[v].add(w)
            self._adj[w].add(v)
            
    # 迭代返回结点v的所有邻结点
    def adjacentTo(self, v):
        return iter(self._adj[v])
    
    # 返回所有结点
    def vertices(self):
        return iter(self._adj)

    # 如果含有v结点,返回True,否则False
    def hasVertex(self, v):
        return v in self._adj

    # 结点v,w间如果有边直连,返回True,否则False
    def hasEdge(self, v, w):
        return w in self._adj[v]
    
    # 返回结点总数
    def countV(self):
        return len(self._adj)
    
    # 返回边总数
    def countE(self):
        return self._e
    
    # 返回v结点的度
    def degree(self, v):
        return len(self._adj[v])
    #打印列表l
    def print_path(self, l):
        for x in l:
            print("%s -> "%x, end='')
        print("\n", end='')
    #打印从结点s到t的所有简单路径
    def allpath(self, s, t):
        self.lpath += [s]
        if(s==t):
            self.print_path(self.lpath)
        else:
            for v in self.adjacentTo(str(s)):
                if(v not in self.lpath):             
                    self.allpath(v, t)
        self.lpath.pop()

    # 重构打印类示例的函数
    def __str__(self):
        s = ''
        for v in self.vertices():
            s += v + '  '
            for w in self.adjacentTo(v):
                s += w + ' '
            s += '\n'
        return s

#-----------------------------------------------------------------------

def main():
    #file = sys.argv[1]
    file = 'E:\\python_code\\G.txt'
    graph = Graph(file)
    stdio.writeln(graph)
    print("all path:")
    graph.allpath('a5', 'a9')
    print("all path:")
    graph.allpath('a0', 'a2')
    print("all path:")
    graph.allpath('a0', 'a6')
    

if __name__ == '__main__':
    main()

G.txt内容

a0 a1
a0 a2
a3 a4
a5 a6
a5 a7
a6 a7
a6 a8
a7 a8
a8 a9

打印结果:

a0  a1 a2 
a1  a0 
a2  a0 
a3  a4 
a4  a3 
a5  a7 a6 
a6  a5 a7 a8 
a7  a5 a8 a6 
a8  a7 a6 a9 
a9  a8 

all path:
a5 -> a7 -> a8 -> a9 -> 
a5 -> a7 -> a6 -> a8 -> a9 -> 
a5 -> a6 -> a7 -> a8 -> a9 -> 
a5 -> a6 -> a8 -> a9 -> 
all path:
a0 -> a2 -> 
all path:

 

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值