1.1 用邻接矩阵存储有向图

例 1.1 用邻接矩阵存储有向图,并输出各顶点的出入和入度。

输入描述:

输入文件中包含多个测试数据,每个测试数据描述了一个无权有向图。每个测试数据的第一
行为两个正整数 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
0 0

样例输出:

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

代码

package main

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

var (
	inputFile      = "./testdata/input.txt"
	array          = [100][100]int{}
	vCount, eCount = 0, 0
)

func main() {
	file, err := os.Open(inputFile)
	if err != nil {
		log.Fatalln(err)
	}
	scanner := bufio.NewScanner(file)
	for i := 0; scanner.Scan(); i++ {
		a, b := 0, 0
		fmt.Sscan(scanner.Text(), &a, &b)
		if a == 0 && b == 0 {
			break
		}
		if i == 0 {
			vCount, eCount = a, b
			continue
		}
		array[a-1][b-1] = 1
	}

	buf := bytes.NewBuffer(nil)
	for i := 0; i < vCount; i++ {
		sum := 0
		for j := 0; j < vCount; j++ {
			sum += array[i][j]
		}
		buf.WriteString(strconv.Itoa(sum))
		if i != vCount-1 {
			buf.WriteByte(' ')
		} else {
			buf.WriteByte('\n')
		}
	}

	for i := 0; i < vCount; i++ {
		sum := 0
		for j := 0; j < eCount; j++ {
			sum += array[j][i]
		}
		buf.WriteString(strconv.Itoa(sum))
		if i != vCount-1 {
			buf.WriteByte(' ')
		} else {
			buf.WriteByte('\n')
		}
	}
	fmt.Print(buf.String())
}
posted @ 2024-02-06 17:06  feiquan  阅读(30)  评论(0)    收藏  举报
如果是此文是转载文章,本人会附上转载链接,此篇文章的版权归原创作者所属,如果侵权请与我联系,我会删除此文。

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