算法题 DFS 序 1问题

DFS 序 1问题

https://loj.ac/p/144

解法一 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()
}

解法二 未完待续

posted @ 2022-03-25 16:19  风清扬,心飘扬  阅读(73)  评论(0)    收藏  举报