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