zoukankan      html  css  js  c++  java
  • 服务依赖开闭简单算法

    // 服务依赖

    // n q, n个服务,q次查询。
    // 下面n行,表示第i个服务依赖的服务数量k,下面k服务id分别x,xx。k=0表示没有依赖
    // 下面q行,表示q次查询,每次查询x,y,x=1表示开启y服务,x=0表示关闭y服务
    // 重复 开启、关闭同一个服务不会造成任何影响
    // 当服务 a 引入了服务 b 作为依赖之后,服务 a 启动时 b 会随之启动,b 停止时 a 会随之停止

    package main
    
    import (
    	"fmt"
    )
    
    
    // 3 2
    // 1 2
    // 1 3
    // 0
    // 1 1
    // 0 2
    type service struct {
    	isOpen   bool
    	requires []int
    }
    
    var serviceMap = make(map[int]*service)
    var serviceStatus = make(map[int]bool)
    var opened = 0
    
    func main() {
    	n, q := 0, 0
    	fmt.Scan(&n, &q)
    	for i := 1; i <= n; i++ {
    		e := &service{isOpen: false}
    		serviceMap[i] = e
    		serviceStatus[i] = false
    
    		subs := 0
    		fmt.Scan(&subs)
    		if subs == 0 {
    			continue
    		}
    
    		for j := 0; j < subs; j++ {
    			v := 0
    			fmt.Scan(&v)
    			e.requires = append(e.requires, v)
    		}
    	}
    
    	x, y := 0, 0
    	for i := 0; i < q; i++ {
    		fmt.Scan(&x, &y)
    		if x == 1 {
    			open(y)
    		} else {
    			closes(y)
    		}
    		fmt.Println(opened)
    	}
    }
    
    // open by bfs
    func open(id int) {
    	if isOpened := serviceStatus[id]; isOpened {
    		return
    	}
    
    	q := []int{id}
    	for len(q) > 0 {
    		front := q[0]
    		q = q[1:]
    
    		e := serviceMap[front]
    		if e.isOpen {
    			continue
    		}
    
    		opened++
    		e.isOpen = true
    		serviceStatus[front] = true
    		q = append(q, e.requires...)
    	}
    }
    
    // closes by dfs Recursion
    func closes(id int) {
    	if isOpened := serviceStatus[id]; !isOpened {
    		return
    	}
    
    	opened--
    	serviceStatus[id] = false
    	serviceMap[id].isOpen = false
    	for k, v := range serviceMap {
    		if k != id && v.isOpen && InArray(id, v.requires) {
    			closes(k)
    		}
    	}
    }
    
    func InArray(x int, arr []int) bool {
    	for _, v := range arr {
    		if v == x {
    			return true
    		}
    	}
    	return false
    }
    
    
    © 2017-2020 版权属于 QXQZX &
  • 相关阅读:
    [k8s微服务作业]-day2-Docker基础
    运维常用命令记录
    【莫比乌斯反演】学习笔记
    2021牛客OI赛前集训营-提高组(第一场)
    NOIP 计划 · 模拟赛 #10
    2021牛客OI赛前集训营-提高组(第二场)
    10.5 模拟赛题解报告
    组合数学
    线段树合并
    2021, 9,26 模拟赛
  • 原文地址:https://www.cnblogs.com/devhg/p/15256733.html
Copyright © 2011-2022 走看看