算法题 DFS 序 1问题
DFS 序 1问题
解法一 BFS+DFS
用了DFS,BFS来实现了,看了测试数据2,5都是很大的数据,正确性对的,但是内存超了,这个题肯定还有更好的解法。
package main
import (
"bufio"
"fmt"
"os"
"strconv"
"strings"
)
type graph struct {
graphdata map[int][]int
isVisitd map[int]bool
weight []int
ssrpInfor map[int]int
optNubmer int
rootID int
}
func (g *graph) resetVisited(){
g.isVisitd = make(map[int]bool)
}
func (g *graph) dfs(curNode int,sum int) int{
_,ok :=g.isVisitd[curNode]
if ok {
return sum
}
g.isVisitd[curNode] = true
sum += g.weight[curNode-1]
neighbors,ok := g.graphdata[curNode]
if ok {
for i:= range neighbors{
neighborDeep ,_ := g.ssrpInfor[neighbors[i]]
curDeep ,_ := g.ssrpInfor[curNode]
if neighborDeep>curDeep {
sum = g.dfs(neighbors[i],sum)
}
}
}
return sum
}
func (g *graph) initgraph() (*bufio.Scanner ){
// 从标准输入流中接收输入数据
input := bufio.NewScanner(os.Stdin)
bs := make([]byte, 10*2000*1024)
input.Buffer(bs, len(bs))
input.Scan()
line1 :=input.Text()
line1Element := strings.Split(line1," ")
if len(line1Element)<3 {
fmt.Println("line 1 error")
return input
}
N, err := strconv.Atoi(line1Element[0])
if err != nil {
fmt.Println(err)
}
M, err := strconv.Atoi(line1Element[1])
if err != nil {
fmt.Println(err)
}
g.optNubmer = M
R, err := strconv.Atoi(line1Element[2])
if err != nil {
fmt.Println(err)
}
g.rootID = R
input.Scan()
line2 := input.Text()
line2Element := strings.Split(line2," ")
if len(line2Element)!=N {
fmt.Println("error in line 2")
return input
}
g.weight = make([]int, len(line2Element))
for i:=0;i<len(line2Element);i++{
g.weight[i], _ = strconv.Atoi(line2Element[i])
}
g.graphdata = make(map[int][]int)
for i:=0;i<N-1;i++{
input.Scan()
line := input.Text()
edge := strings.Split(line," ")
src, _ := strconv.Atoi(edge[0])
dest, _ := strconv.Atoi(edge[1])
neighbors1, ok := g.graphdata[src]
if ok {
g.graphdata[src] = append(neighbors1, dest)
}else{
newNeighbor := make([]int,1)
newNeighbor[0] = dest
g.graphdata[src] = newNeighbor
}
neighbors2, ok := g.graphdata[dest]
if ok {
g.graphdata[dest] = append(neighbors2, src)
}else{
newNeighbor := make([]int,1)
newNeighbor[0] = src
g.graphdata[dest] = newNeighbor
}
}
return input
}
func (g *graph)ssrp(rootNode int){
deep:=0
g.ssrpInfor = make(map[int]int)
bufferQueue := make([]int,0)
g.ssrpInfor[rootNode] = deep
bufferQueue = append(bufferQueue,rootNode)
for {//队列里面没有元素了
if len(bufferQueue)==0 {
break
}
//队列里面取出来一个元素。
curNode := bufferQueue[0]
bufferQueue = bufferQueue[1:]
for i:=0;i<len(g.graphdata[curNode]);i++{
neighbor := g.graphdata[curNode][i]
_,ok := g.ssrpInfor[neighbor]//是否已经访问过了。
if !ok {
//没访问过。
bufferQueue = append(bufferQueue,neighbor )//入队列
g.ssrpInfor[neighbor] = g.ssrpInfor[curNode] + 1 //单元最短路径+1
}
}
}
}
func (g *graph)opt(input *bufio.Scanner) {
for i:=0;i < g.optNubmer;i++{
input.Scan()
line := input.Text()
opt:=strings.Split(line," ")
optType, _ := strconv.Atoi(opt[0])
if optType == 1 {
node,_ :=strconv.Atoi(opt[1])
add,_ :=strconv.Atoi(opt[2])
g.addWeight(node,add)
}else if optType == 2 {
node,_ :=strconv.Atoi(opt[1])
g.resetVisited()
sum := g.dfs(node,0)
fmt.Println(sum)
}else{
fmt.Println("error opt")
}
}
}
func (g *graph)printgraph() {
for i := range g.weight{
fmt.Printf("点%d ,权重是 %d\n",i+1,g.weight[i])
}
for i := range g.graphdata{
fmt.Printf("点 %d 出边是 %v\n",i,g.graphdata[i])
}
}
func (g *graph)addWeight(node int,add int) {
g.weight[node-1]+=add
}
func Number144Main() {
var g graph
input := g.initgraph()
//g.printgraph()
g.ssrp(g.rootID)
//fmt.Println("ssrp infor")
//fmt.Println(g.ssrpInfor)
g.opt(input)
}
func main(){
Number144Main()
}

浙公网安备 33010602011771号