1.3 用邻接表存储有向图

1.3 用邻接表存储有向图,并输出各顶点的出入和入度

输入描述:

输入文件中包含多个测试数据,每个测试数据描述了一个无权有向图。每个测试数据的第一
行为两个正整数 n 和 m,1≤ n ≤ 100,1≤ m ≤ 500,分别表示该有向图的顶点数目和边数,顶点的
序号从 1 开始计起。接下来有 m 行,每行为两个正整数,用空格隔开,分别表示一条边的起点和
终点。每条边出现一次且仅一次,图中不存在自身环和重边。输入文件最后一行为 0 0,表示输入
数据结束。

输出描述:

对输入文件中的每个有向图,输出两行:第 1 行为 n 个正整数,表示每个顶点的出度;第 2
行也为 n 个正整数,表示每个顶点的入度。每两个正整数之间用一个空格隔开,每行的最后一个
正整数之后没有空格。

样例输入:

7 9
1 2
2 3
2 5
2 6
3 5
4 3
5 2
5 4
6 7
4 7
1 4
2 1
2 2
2 3
2 3
4 2
4 3
0 0

样例输出:

1 3 1 1 2 1 0
0 2 2 1 2 1 1
1 4 0 2
1 2 3 1

代码

package main

import (
	"bufio"
	"fmt"
	"log"
	"os"
)

type ArcNode struct { // 边节点
	AdjVex  int      // 邻接点序号
	NextArc *ArcNode // 下一个邻接边
}

type VNode struct { // 顶点
	Data   int
	ArcOut *ArcNode // 出度边
	ArcIn  *ArcNode // 入度边
}

type LGraph struct { // 图的邻接表存储结构
	ArcNum int      // 边数
	VNodes []*VNode // 顶点数
}

func main() {
	file, err := os.Open("./testdata/input.txt")
	if err != nil {
		log.Fatalln(err)
	}
	scanner := bufio.NewScanner(file)

	for scanner.Scan() {
		var vNum, aNum int
		fmt.Sscan(scanner.Text(), &vNum, &aNum)
		if vNum == 0 && aNum == 0 {
			return
		}

		g := LGraph{
			ArcNum: aNum,
			VNodes: make([]*VNode, vNum),
		}
		for i := 0; i < aNum && scanner.Scan(); i++ {
			var s, e int
			fmt.Sscan(scanner.Text(), &s, &e)
			s--
			e--

			if g.VNodes[s] == nil {
				g.VNodes[s] = &VNode{Data: s}
			}

			if g.VNodes[e] == nil {
				g.VNodes[e] = &VNode{Data: e}
			}

			sNode, eNode := &ArcNode{AdjVex: s}, &ArcNode{AdjVex: e}
			sNode.NextArc = g.VNodes[s].ArcOut
			g.VNodes[s].ArcOut = sNode

			eNode.NextArc = g.VNodes[e].ArcIn
			g.VNodes[e].ArcIn = eNode
		}

		inCounts, outCounts := make([]int, vNum), make([]int, vNum)
		for i := range g.VNodes {
			vNode := g.VNodes[i]
			p := vNode.ArcIn
			for p != nil {
				inCounts[i]++
				p = p.NextArc
			}
			p = vNode.ArcOut
			for p != nil {
				outCounts[i]++
				p = p.NextArc
			}
		}
		for _, v := range outCounts {
			fmt.Print(v)
		}
		fmt.Println()
		for _, v := range inCounts {
			fmt.Print(v)
		}
		fmt.Println()
	}
}

posted @ 2024-02-07 15:02  feiquan  阅读(69)  评论(0)    收藏  举报
如果是此文是转载文章,本人会附上转载链接,此篇文章的版权归原创作者所属,如果侵权请与我联系,我会删除此文。

若没有标明转载链接,此篇文章属于本人的原创文章,其版权所属:
作者:feiquan
出处:http://www.cnblogs.com/feiquan/
版权声明:本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
大家写文都不容易,请尊重劳动成果~ 这里谢谢大家啦(*/ω\*)